为了账号安全,请及时绑定邮箱和手机立即绑定

golang排序切片升序或降序

golang排序切片升序或降序

Go
拉丁的传说 2022-01-17 16:40:12
我需要对来自 3rdparty 包的类型的切片进行排序。根据某些条件,顺序必须是升序或降序。我想出的解决方案是:type fooAscending []foofunc (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 []foofunc (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 行代码,其中大部分是重复的,似乎有点太多了。
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

从 Go 1.8 开始,有一种更简单的方法可以对切片进行排序,而无需您定义新类型。您只需将匿名函数传递给该sort.Slice函数。


a := []int{5, 3, 4, 7, 8, 9}

sort.Slice(a, func(i, j int) bool {

    return a[i] < a[j]

})

for _, v := range a {

    fmt.Println(v)

}

这将按升序排序,如果您想要相反,只需a[i] > a[j]在匿名函数中编写即可。


查看完整回答
反对 回复 2022-01-17
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

你正在寻找sort.Reverse. 这会让你说:

sort.Sort(sort.Reverse(fooAscending(s)))


查看完整回答
反对 回复 2022-01-17
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我在下面的回答是基于您从第三方包收到的切片是基本 Go 类型的假设。


要对基本类型的切片进行排序,请使用 sort 包实用程序。这是一个对字符串切片和 int 切片进行排序的示例。


package main


import (

    "fmt"

    "sort"

)


func main() {

    sl := []string{"mumbai", "london", "tokyo", "seattle"}

    sort.Sort(sort.StringSlice(sl))

    fmt.Println(sl)


    intSlice := []int{3,5,6,4,2,293,-34}

    sort.Sort(sort.IntSlice(intSlice))

    fmt.Println(intSlice)

}

上面的输出是:


[london mumbai seattle tokyo]

[-34 2 3 4 5 6 293]

这里的 Go Playground自己试试吧。

有几点需要注意:

  1. 对基本 Go 类型进行排序不需要实现 Len() 等属于 sort.Interface 的函数。您只需要为复合类型采用该路线。

  2. 只需使用适当的接口方法提供程序(例如StringSliceIntSliceFloat64Slice )包装基本类型的类型,然后进行排序。

  3. 切片是就地排序的,因此不会返回已排序切片的副本。


查看完整回答
反对 回复 2022-01-17
  • 3 回答
  • 0 关注
  • 467 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号