如何对golang中的固定长度数组进行排序?
我有以下多元数组:如何对golang中的固定长度数组进行排序?,go,Go,我有以下多元数组: x := [2][3]int{ {3, 2, 1}, {3, 2, 1}, } 行和列的大小都是固定的 我试图检查行是否已排序,我理解排序函数需要大小未知的数组。我该如何要求go以一个固定的、已知的大小来对待这个项目,就像它有一个未知的大小一样 var allTrue bool = true for i := range x { t := sort.Ints(x[i]) == []int{1, 2, 3} allTrue = allTrue &
x := [2][3]int{
{3, 2, 1},
{3, 2, 1},
}
行和列的大小都是固定的
我试图检查行是否已排序,我理解排序函数需要大小未知的数组。我该如何要求go以一个固定的、已知的大小来对待这个项目,就像它有一个未知的大小一样
var allTrue bool = true
for i := range x {
t := sort.Ints(x[i]) == []int{1, 2, 3}
allTrue = allTrue && t
}
我得到:
./main.go:xx:yy: sort.Ints(x[i]) used as value
./main.go:xx:yy: cannot use x[i] (type [3]int) as type []int in argument to sort.Ints
我是否正确读取了此错误消息?您必须先使用
[:]
运算符对数组进行切片,然后才能将其与排序
包一起使用。见:和
此外,您还可以使用sort.IntsAreSorted([]int)
检查切片的排序是否比排序更有效,如下所示
var allTrue bool = true
for i := range x {
if !sort.IntsAreSorted(x[i][:]) {
allTrue = false
break
}
}
必须先使用
[:]
运算符对数组进行切片,然后才能将其与排序
包一起使用。见:和
此外,您还可以使用sort.IntsAreSorted([]int)
检查切片的排序是否比排序更有效,如下所示
var allTrue bool = true
for i := range x {
if !sort.IntsAreSorted(x[i][:]) {
allTrue = false
break
}
}
尽管如此,它提供了有关使用sort
包的适当切片的指导,我添加了这个答案,以提供关于您发布的代码的一些进一步问题的更多描述。我希望这有助于你理解围棋语言
切片简介 我理解排序函数需要大小未知的数组[sic] 正如其他人所说,这不是Go中描述这一概念的术语。所有Go数组的大小都是固定的,如所定义的。如您所知,对于包含
T
类型元素的非负数N
的数组,数组的类型为[N]T
。这在编译时是固定的,在程序运行时不会更改
“没有已知大小的数组”最接近于切片。切片是Go中的不同类型,允许表示特定类型的数据序列,其中它们的长度由Go运行时动态管理。对于T
类型的元素,它们的类型为[]T
。特别是,它们的大小不是其类型定义的一部分,可以在运行时更改。对于某些切片变量x[]T
,实现提供:
- 一种类似元素类型的内部后备阵列,其中实现管理内存的分配以及随着片长的增加阵列的扩展
- 它的长度
–表示片当前包含的元素数len(x)
- 其容量
–切片的总长度加上备用阵列的额外范围,由于切片操作限制了阵列上的视图,或运行时分配了更大的阵列以允许向切片添加更多项目,因此可能会超出长度cap(x)
用代码解决问题 如上所述,片的类型与数组不同,因此对于需要
[]T
类型的部分N
和T
,不能使用[N]T
类型的内容
sort.int
对整数片段进行适当排序–它具有类型签名func int(a[]int)
。调用sort.int(x[i])
在索引i
处对数组x
进行索引,该数组将返回类型为[3]int
的数组。这与sort函数不兼容,并导致您观察到的编译时错误
要从数组中获取切片,请使用。此类表达式允许使用数组、切片和其他一些类型来构造新切片
切片表达式以a[low:high]
的形式给出,其中low
和high
是可选的整数,为支持数组或切片提供索引,指定在新切片中返回的范围。上面的语言规范链接有更多细节,我建议您阅读;只需说,对于某些数组或切片a
而言,最简单的切片表达式a[:]
就是语法上的糖分,意思是a[0:len(a)-1]
,即将数组/切片转换为相同长度的切片
使用此技巧,通过切片:x[i][:]
,从多维数组中获取类型为[]int
的切片:
- 与前面一样,
返回类型为x[i]
的数组[3]int
- 切片返回的数组将返回类型为
的切片,该类型与[]int
兼容sort.int
sort.int
不返回值,切片不可比较
即使您用代码解决了这些问题,以下代码行仍存在两个问题:
t := sort.Ints(x[i]) == []int{1, 2, 3}
sort.int
就地排序;它不返回值,因此相等性测试没有意义sort.Ints
对不可比较的切片进行操作。如果A
或B
是片,则不可能调用A==B
,除非A
或B
是特殊标识符nil
。这是一个微妙的一点,这一点在本文中有所阐述。(旁白:请阅读该页,因为您会注意到数组具有可比性。)==
相等运算符直接比较切片,因此验证切片的元素相等性需要:
- 切片具有相同的长度(不同的长度意味着一个切片比另一个切片具有更多的元素)
- 一个切片的每个索引处的元素与其他切片相同
arr := [3]int{1, 2, 3}
slc := arr[:] // []int{1, 2, 3}, backed by arr
sort.Ints(x[0][:])
sort.Ints(x[1][:])
// Now both elements of "x" are sorted.