golang的sort库

1.golang中排序

       排序是程序员要考虑的主要算法之一。在不同语言中会实现不同的排序,C默认是对数组进行排序, C++是对一个序列进行排序, Go则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个slice(分片, 类似于数组),或是包含 slice 的一个对象。

        golang中的排序主要通过sort库;sort库的排序可以通过插入排序、归并排序、堆排序和快速排序等方法,这些方法被封装在sort包里。

2.golang的sort库的用法

       sort包可以队切片进行排序和用户自定义的数据集进行排序。

1)sort库对切片排序

       sort包主要针对[]int、[]float64、[]string等切片排序,分别提供了 sort.Ints() 、 sort.Float64s() 和 sort.Strings() 函数, 默认都是从小到大排序。

参考代码如下:

package main
 
import (
 "fmt"
 "sort"
)
 
func main() {
 intList := [] int {2, 4, 3, 5, 7, 6, 9, 8, 1, 0}
 float8List := [] float64 {4.2, 5.9, 12.3, 10.0, 50.4, 99.9, 31.4, 27.81828, 3.14}
 stringList := [] string {"a", "c", "b", "d", "f", "i", "z", "x", "w", "y"}
 
 sort.Ints(intList)
 sort.Float64s(float8List)
 sort.Strings(stringList)
 
 fmt.Printf("%v\n%v\n%v\n", intList, float8List, stringList)
 
}

go 的 sort 包可以使用 sort.Reverse(slice) 来实现逆序排序。

2)sort库对自定义数据集排序

sort 包中有一个 sort.Interface 接口,该接口有三个方法 Len()  、 Less(i,j) 和 Swap(i,j) 。 通用排序函数 sort.Sort 可以排序任何实现了 sort.Inferface 接口的对象(变量)。对于 [] int 、[] float64 和 [] string 除了使用特殊指定的函数外,还可以使用改装过的类型 IntSclice 、 Float64Slice 和 StringSlice , 然后直接调用它们对应的 Sort() 方法;因为这三种类型也实现了 sort.Interface 接口, 所以可以通过 sort.Reverse 来转换这三种类型的 Interface.Less 方法来实现逆向排序, 这就是前面最后一个排序的使用。

下面使用了一个自定义(用户定义)的 Reverse 结构体, 而不是 sort.Reverse 函数, 来实现逆向排序。

参考代码如下:

package main
 
import (
 "fmt"
 "sort"
)
 
type Person struct {
 Name string
 Age int
}
 
// 按照 Person.Age 从大到小排序
type PersonSlice [] Person
 
func (a PersonSlice) Len() int {   // 重写 Len() 方法
 return len(a)
}
func (a PersonSlice) Swap(i, j int){  // 重写 Swap() 方法
 a[i], a[j] = a[j], a[i]
}
func (a PersonSlice) Less(i, j int) bool { // 重写 Less() 方法, 从大到小排序
 return a[j].Age < a[i].Age
}
 
func main() {
 people := [] Person{
  {"zhang san", 12},
  {"li si", 30},
  {"wang wu", 52},
  {"zhao liu", 26},
 }
 
 fmt.Println(people)
 
 sort.Sort(PersonSlice(people)) // 按照 Age 的逆序排序
 fmt.Println(people)
 
 sort.Sort(sort.Reverse(PersonSlice(people))) // 按照 Age 的升序排序
 fmt.Println(people)
 
}

 

该方法,是重写了sort结构,让sort方法实现自定义结构体排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值