如何在 Go 中对某物的切片进行排序(如何比较两个切片)

eNV*_*eNV 2 comparison go

在 Go 中可以比较两个字符串:

package main

func main() {
    println("ab" > "ba")
    println("ab" < "ba")
}
Run Code Online (Sandbox Code Playgroud)
false
true

Program exited.
Run Code Online (Sandbox Code Playgroud)

https://go.dev/play/p/svkLf6R84SC

如何对两个切片执行类似的操作?例如[]int{1,2} > []int{2,1}

我需要它来对一片整数切片进行排序。所以我需要一个sort.Interface.

type Interface interface {
    Len() int
    Less(i, j int) bool
    Swap(i, j int)
}
Run Code Online (Sandbox Code Playgroud)

如果这个实现是通用的那就更好了。

Jim*_*imB 6

编写比较器和 less 函数sort.Slices将是在标准库中执行此操作的最有效方法。稍微超出这个范围(直到标准库中的泛型使用最终确定),在 Go 1.18 中,我们可以使用golang.org/x/exp/constraintsgolang.org/x/exp/slices包对有序值的切片进行一般排序:https ://go.dev/play/p/MA0lY6POVFR

func SortSlices[T constraints.Ordered](s [][]T) {
    sort.Slice(s, func(i, j int) bool {
        return slices.Compare(s[i], s[j]) < 0
    })
}
Run Code Online (Sandbox Code Playgroud)

有关以下内容的文档slices.Compare

Compare 比较 s1 和 s2 的元素。从索引 0 开始按顺序比较元素,直到一个元素不等于另一个元素。返回第一个不匹配元素的比较结果。如果两个切片在其中一个结束之前都相等,则认为较短的切片小于较长的切片。如果 s1 == s2,结果为 0;如果 s1 < s2,结果为 -1;如果 s1 > s2,结果为 +1。涉及浮点 NaN 的比较将被忽略。