我在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
基本上,我想获取数组中最小的非零值。 如何对此数组进行排序以实现此目的?
答案 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
切片表达式从字符串数组构造子字符串或切片, 指向数组或切片的指针。有两种变体:一种简单的形式 指定低限和高限,以及指定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])
}