如何对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.