英文:
How do I sort a slice of slices of something (how do I compare two slices) in Go
问题
在Go语言中,可以比较两个字符串:
package main
func main() {
println("ab" > "ba")
println("ab" < "ba")
}
false
true
程序已退出。
链接: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)
}
最好这个实现是通用的。
英文:
In Go is possible to compare two strings:
package main
func main() {
println("ab" > "ba")
println("ab" < "ba")
}
false
true
Program exited.
https://go.dev/play/p/svkLf6R84SC
How do I perform a similar operation on two slices? e.g. []int{1,2} > []int{2,1}
.
I need this to sort a slice of slices of ints. So I need an implementation of sort.Interface
.
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
It would be better if this implementation is generic.
答案1
得分: 6
在标准库中,编写一个比较器和一个用于sort.Slices
的less函数将是最有效的方法。稍微超出标准库的范围(直到标准库内的泛型用法最终确定),在Go 1.18中,我们可以使用golang.org/x/exp/constraints
和golang.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
})
}
关于slices.Compare
的文档:slices.Compare
:
Compare比较s1和s2的元素。元素按顺序逐个比较,从索引0开始,直到找到一个不相等的元素。返回比较第一个不匹配元素的结果。如果两个切片在其中一个结束之前都相等,则较短的切片被认为小于较长的切片。如果s1 == s2,则结果为0;如果s1 < s2,则结果为-1;如果s1 > s2,则结果为+1。比较中涉及到浮点数NaN的情况将被忽略。
英文:
Writing a comparator and a less function for sort.Slices
would be the most effective way to do this within the standard library.
Stepping outside of that slightly (until generics usage within the standard library is finalized), in Go 1.18 we can use the golang.org/x/exp/constraints
and golang.org/x/exp/slices
packages to generically sort a slice of slices of ordered values: 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
})
}
Documentation about slices.Compare
:
> Compare compares the elements of s1 and s2. The elements are compared sequentially, starting at index 0, until one element is not equal to the other. The result of comparing the first non-matching elements is returned. If both slices are equal until one of them ends, the shorter slice is considered less than the longer one. The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2. Comparisons involving floating point NaNs are ignored.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论