我需要对来自第三方软件包的类型进行排序。根据某些条件,顺序必须是升序或降序。
我想到的解决方案是:
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行代码,而且大部分都是重复的,似乎有点太多了。
9条答案
按热度按时间sd2nnvve1#
从Go 1.8开始,有一种更简单的方法来对切片进行排序,不需要定义新类型。只需将一个匿名函数传递给
sort.Slice
函数。这将按升序排序,如果你想要相反的,只需在匿名函数中写入
a[i] > a[j]
。ygya80vv2#
你在找
sort.Reverse
这会让你说:gmol16393#
我下面的答案是基于这样的假设,即您从第三方包接收的切片是基本的Go类型。
要对基本类型的片进行排序,请使用排序包实用程序。下面是一个对string和int的切片进行排序的例子。
上面的输出是:
请访问Go Playground here,自己尝试一下。
有几件事值得注意:
1.对基本Go类型进行排序不需要实现像Len()这样属于sort.Interface的函数。您只需要对复合类型采用这种方法。
1.只需使用适当的Interface方法提供程序 Package 基本类型的类型,例如StringSlice、IntSlice或Float64Slice,并进行排序。
1.切片是就地排序的,因此不会返回已排序切片的副本。
kxe2p93d4#
公认的答案是好的,但我不同意他们关于下降的建议:
对于
sort.Slice
,提供的函数应该表示“小于”的实现:func Slice(x interface{}, less func(i, j int) bool)
Slice
根据提供的less
函数对切片x
进行排序。如果x
不是一个切片,它会死机。因此,编写一个“大于”函数并不真正符合给定的描述。最好是反转索引:
两者都应该返回相同的结果,但我认为其中一个更符合习惯。
https://golang.org/pkg/sort#Slice
qmelpv7a5#
也许你可以使用
sort.Sort
方法来排序切片。:)y53ybaqx6#
你可以从golang的标准库中导入“sort”包。然后你可以使用“Slice”或“SliceStable”函数来排序你的切片。建议使用第二个,如下所示:
示例:包main
a1o7rhls7#
游戏名称:The Go Playgound https://play.golang.org/p/Q8KY_JE__kx
xxb16uws8#
升序排序:
输出:
降序排序:
输出:
zzwlnbp89#
如果由于任何原因你不能或不想使用sort包,下面将实现一个冒泡排序类型的排序(它接受一个int64切片并返回一个int64切片):