分析golang的slice排序
来源:互联网 发布:书生商友seo 编辑:程序博客网 时间:2024/05/29 18:40
今天写代码,牵扯到给一个slice排序的问题,发现go的sort包里支持自定义排序,果断拿来用了。
sort.Slice(priceList, func(i, j int) bool { return priceList[i].RenewDate > priceList[j].RenewDate })
上面这个是使用sort.Slice()
的例子。
在此之前,先讲讲基础的Sort方法,
type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with indexes i and j. Swap(i, j int)}func Sort(data Interface) { n := data.Len() quickSort(data, 0, n, maxDepth(n))}func quickSort(data Interface, a, b, maxDepth int) { . . .}
我们发现,要实现sort排序,我们需要实现sort接口的三个方法,分别是Len()
,Less(i, j int) bool
,和Swap(i, j int)
。这三个方法的注释上面都有,我就不解释了。它接收Interface接口,拿到了Interface接口,就可以去调用实现了这个接口的类型所对应的三个方法。Sort方法内部会去调一个快排算法,既然是快排算法,里面肯定用到了less和swap,所以内部实现就不贴出来了。所以针对一般的sort.Sort(某个切片)
,使用例子如下:
type Person struct { Name string Age int}type PersonSlice [] Personfunc (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 wan", 15}, {"li zi", 31}, {"wang su", 32}, {"zhao miu", 28}, } sort.Sort(PersonSlice(people)) // 按照 Age 的逆序排序,参数传递给接口 fmt.Println(people)
接下来讲一个更高效的,那就是sort.Slice()
方法了,
sort.Slice(priceList, func(i, j int) bool { return priceList[i].RenewDate > priceList[j].RenewDate })//使用func Slice(slice interface{}, less func(i, j int) bool) { rv := reflect.ValueOf(slice) swap := reflect.Swapper(slice) length := rv.Len() quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))}//源码
如上所述,我直接写一个less函数作为函数对象传给Slice方法,这里其实相当于callback的思想了,然后swap和len方法系统帮我自动实现,len就是我的第一个参数的长度,swap用系统默认的交换算法,这样我就高效的编写了一个可以由我自己来定义排序顺序的struct切片排序,不仅简洁优雅,代码量小,而且容易被人理解,真是又一次体会到了go的魅力。
阅读全文
0 0
- 分析golang的slice排序
- Golang-slice
- golang slice
- goLang slice 类型的简单应用
- Golang中array和slice的总结
- golang日記 -Java的ArrayList和Golang的slice
- golang ---- slice 切片
- Golang slice 切片
- golang slice 切片原理
- [golang]array与slice
- 对GoLang里的slice要谨慎使用append操作
- go(golang)之slice的小想法1
- golang 中使用数组创建slice时的注意事项
- Golang:make,slice和append的一个小细节
- Golang去除slice和list的重复元素
- golang实现通过索引删除任意类型的slice元素
- golang通道中传递slice数据的入坑经验
- golang 中的 slice array map
- JS之随机点名系统
- qt调试中的一些问题
- 模拟实现容器适配器栈和队列
- 【实战】计算器的样式布局
- 第十一天(HTML5BASIC)
- 分析golang的slice排序
- 调用request请求返回xml
- 二叉树:前序,后序,中序遍历(递归+非递归);层次(队列)
- ajax的一些小问题
- 元素的显示隐藏
- 排序总结
- [堪称经典]JAVA多线程和并发基础面试问答
- 利用mvc 和数据结合来做mail 邮件系统
- Leetcode——第21题