如何在go中反转任意数组?



当然,人们总是可以写一个for循环。但是代码共享通常总是好的。那么有没有办法编写一个对任何数组进行排序的方法呢?还有,性能,所以我猜这排除了反射。

sort.Reverse似乎不起作用。以下内容不会编译:

package main
import (
"fmt"
"sort"
)
type A struct {
X int
}
func main() {
x := make([]A, 0)
x = append(x, A{1})
x = append(x, A{2})
sort.Reverse(sort.IntSlice(x))
fmt.Println(x)
}
[]A

不是整数切片,它是结构的切片,您必须实现一个sort.Interface来描述如何对其进行排序。

下面是一个工作示例:

package main
import (
"fmt"
"sort"
)
type A struct {
X int
}
type ByX []A
func (a ByX) Len() int           { return len(a) }
func (a ByX) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByX) Less(i, j int) bool { return a[i].X < a[j].X }
func main() {
x := make([]A, 0)
x = append(x, A{1})
x = append(x, A{2})
sort.Sort(sort.Reverse(ByX(x)))
fmt.Println(x)
}

在围棋操场上尝试一下。

或者,您可以调用sort.Slice并仅为其提供Less函数:

sort.Slice(x, func(i, j int) bool { return x[i].X > x[j].X })

您应该注意到,less 函数是不同的。由于我们想反向排序,而速记sort.Slicesort.Reverse不兼容,我们不得不修改 less 函数以返回相反的函数(>而不是<(。

最新更新