golang排序切片升序或降序

我需要对来自 3rdparty 包的类型的切片进行排序。根据某些条件,顺序必须是升序或降序。


我想出的解决方案是:


type fooAscending []foo


func (v fooAscending) Len() int           { return len(v) }

func (v fooAscending) Swap(i, j int)      { v[i], v[j] = v[j], v[i] }

func (v fooAscending) Less(i, j int) bool { return v[i].Amount < v[j].Amount }


type fooDescending []foo


func (v fooDescending) Len() int           { return len(v) }

func (v fooDescending) Swap(i, j int)      { v[i], v[j] = v[j], v[i] }

func (v fooDescending) Less(i, j int) bool { return v[i].Amount > v[j].Amount }


if someCondition {

    sort.Sort(fooAscending(array))

} else {

    sort.Sort(fooDescending(array))

}

有一个更好的方法吗。这个任务的 13 行代码,其中大部分是重复的,似乎有点太多了。


拉丁的传说
浏览 468回答 3
3回答

小怪兽爱吃肉

从 Go 1.8 开始,有一种更简单的方法可以对切片进行排序,而无需您定义新类型。您只需将匿名函数传递给该sort.Slice函数。a := []int{5, 3, 4, 7, 8, 9}sort.Slice(a, func(i, j int) bool {&nbsp; &nbsp; return a[i] < a[j]})for _, v := range a {&nbsp; &nbsp; fmt.Println(v)}这将按升序排序,如果您想要相反,只需a[i] > a[j]在匿名函数中编写即可。

慕工程0101907

你正在寻找sort.Reverse.&nbsp;这会让你说:sort.Sort(sort.Reverse(fooAscending(s)))

幕布斯6054654

我在下面的回答是基于您从第三方包收到的切片是基本 Go 类型的假设。要对基本类型的切片进行排序,请使用 sort 包实用程序。这是一个对字符串切片和 int 切片进行排序的示例。package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "sort")func main() {&nbsp; &nbsp; sl := []string{"mumbai", "london", "tokyo", "seattle"}&nbsp; &nbsp; sort.Sort(sort.StringSlice(sl))&nbsp; &nbsp; fmt.Println(sl)&nbsp; &nbsp; intSlice := []int{3,5,6,4,2,293,-34}&nbsp; &nbsp; sort.Sort(sort.IntSlice(intSlice))&nbsp; &nbsp; fmt.Println(intSlice)}上面的输出是:[london mumbai seattle tokyo][-34 2 3 4 5 6 293]去这里的 Go Playground自己试试吧。有几点需要注意:对基本 Go 类型进行排序不需要实现 Len() 等属于 sort.Interface 的函数。您只需要为复合类型采用该路线。只需使用适当的接口方法提供程序(例如StringSlice、IntSlice或Float64Slice&nbsp;)包装基本类型的类型,然后进行排序。切片是就地排序的,因此不会返回已排序切片的副本。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go