排序多维数组/切片

时间:2015-11-18 13:11:48

标签: arrays sorting multidimensional-array go slice

我在Go中创建了一个多维数组(切片),如下所示:

var distancematrix [5][5]int

所以它是一个5 * 5阵列/切片。 现在我将值插入此切片中,以便在某一点:

distancematrix :  [[0 154 12 35 138] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

现在,我想按升序对此数组进行排序,例如:

sorteddistancematrix :  [[0 12 35  138 154] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

我试过了sort.Ints(distancematrix[0]),但是它引发了一个错误说:

cannot use distancematrix[0] (type [5]int) as type []int in argument to sort.Ints

基本上,我想获取数组中最小的非零值。 如何对此数组进行排序以实现此目的?

3 个答案:

答案 0 :(得分:4)

要获得最小的非零元素,您不需要对其进行排序。对数组或切片进行排序是相对昂贵的操作 - 与获得最小的非零元素相比。

通常要获得最小的非零元素,只需循环遍历值,并寻找最适合您的值。如果你找到一个更好的(在你的例子中是一个更小的非零),保持并继续。

示例实施:

func smallestNonZero(s []int) (n int) {
    for _, v := range s {
        if v != 0 && (v < n || n == 0) {
            n = v
        }
    }
    return
}

注意:当且仅当传递的切片不包含任何非零元素时,此函数才会返回0(也就是说,它已满0 1}} s或它是空的或它是nil)。如果切片(也)包含负数,则此功能也可正常工作。

如果您有一个数组而不是切片,只需切片数组(这会产生切片),这样您就可以将它传递给上面的函数。

使用它:

fmt.Println(smallestNonZero([]int{5, 3, 1, 4}))
fmt.Println(smallestNonZero([]int{0, 3, 5, 8, 0, 2, 9}))
arr := [5]int{0, 154, 12, 35, 138}
fmt.Println(smallestNonZero(arr[:]))

输出(在Go Playground上尝试):

1
2
12

答案 1 :(得分:2)

  

The Go Programming Language Specification

     

Slice expressions

     

切片表达式从字符串数组构造子字符串或切片,   指向数组或切片的指针。有两种变体:一种简单的形式   指定低限和高限,以及指定a的完整形式   受限于能力。

     

简单切片表达式

     

对于字符串,数组,指向数组的指针或切片a,主要的   表达

a[low : high]
     

构造子字符串或切片。指数低和高选择哪个   操作数a的元素出现在结果中。结果有指数   从0开始,长度等于高 - 低。切片后   一个

a := [5]int{1, 2, 3, 4, 5}
s := a[1:4]
     

切片的类型为[] int,长度为3,容量为4,元素为

s[0] == 2
s[1] == 3
s[2] == 4
     

为方便起见,可省略任何索引。失踪低   index默认为零;缺少的高索引默认为长度   切片的操作数:

a[2:]  // same as a[2 : len(a)]
a[:3]  // same as a[0 : 3]
a[:]   // same as a[0 : len(a)]
     

如果a是指向数组的指针,则[low:high]是(* a)[low]的简写   :高]。

要将类型[5]int转换为类型[]int,请对数组进行切片。例如,

package main

import "sort"

func main() {
    var distancematrix [5][5]int
    sort.Ints(distancematrix[0][:])
}

答案 2 :(得分:0)

var distancematrix [5] [5] int,将创建5 * 5 int的多维数组切片。当您尝试访问distancematrix [0]时,它返回类型为[5] int的int数组切片。 sort.Ints需要type [] int。

下面我声明了[] []类型的距离矩阵,因此distancematrix [0]返回类型为[] int的切片数组。

package main

import (
    "fmt"
    "sort"
)

func main() {
    distancematrix := [][]int{{0, 154, 12, 35, 138}, {0, 0, 0, 0, 0}}
    sort.Ints(distancematrix[0])
    fmt.Println(distancematrix[0])
}