golag如何使用sort.slice包实现对象list排序
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章将为大家详细讲解有关golag如何使用sort.slice包实现对象list排序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.sort.Sort介绍使用
千家信息网最后更新 2025年02月01日golag如何使用sort.slice包实现对象list排序
这篇文章将为大家详细讲解有关golag如何使用sort.slice包实现对象list排序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
1.sort.Sort介绍
使用sort.Slice
进行排序,因为slice把struct抽象化了,且slice封装过了,简单的基础类型可以使用sort,使用sort排序需要重写三个interface,不想学习sort排序的可以直接看第三步
这里将对比sort跟slice两种排序的使用方式
1.1分析内置sort包
1.2分析sort.go
要想实现自定义对象的排序功能,需要重写这三个interface
外部调用sort
方法即可实现排序
func Sort(data Interface) {n := data.Len()quickSort(data, 0, n, maxDepth(n))}
通过sort源码可以看到用的快速排序,不懂快排的可以自行重温快排算法,这里就不讲解快排原理了
2.使用方法
2.1基础类型排序
基础类型的排序直接在sort.go
去找就行了
package mainimport ("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)}
2.2对象排序(单一字段)
如果对一个struct
对象的某一个字段进行排序就需要重写一组len,less,swap接口,如果有多组就需要重写多组接口。
下面直接看例子:
如果一个对象只有一个字段需要排序就用下面的例子比较简单
package mainimport ("fmt""sort")type Person struct {Name stringAge int}// 按照 Person.Age 从大到小排序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 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)}
2.3对象排序(多字段)
多个了SortBy
方法可以确定是升序还是降序,同时可以确定排序字段是哪个
package mainimport ("fmt""sort")type Person struct {Name stringAge int}type PersonWrapper struct {people [] Personby func(p, q * Person) bool}//用来判断升序还是降序type SortBy func(p, q *Person) boolfunc (pw PersonWrapper) Len() int { // 重写 Len() 方法return len(pw.people)}func (pw PersonWrapper) Swap(i, j int){ // 重写 Swap() 方法pw.people[i], pw.people[j] = pw.people[j], pw.people[i]}func (pw PersonWrapper) Less(i, j int) bool { // 重写 Less() 方法return pw.by(&pw.people[i], &pw.people[j])}// 封装成 SortPerson 方法func SortPerson(people [] Person, by SortBy){sort.Sort(PersonWrapper{people, by})}func main() {people := [] Person{{"zhang san", 12},{"li si", 30},{"wang wu", 52},{"zhao liu", 26},}fmt.Println(people)//推荐用封装的SortPerson方法sort.Sort(PersonWrapper{people, func (p, q *Person) bool {return q.Age < p.Age // Age 递减排序}})fmt.Println(people)//推荐用这种SortPerson(people, func (p, q *Person) bool {return p.Name < q.Name // Name 递增排序})fmt.Println(people)}
如果不喜欢用sortby
方法,也可以重写多个less、len、swap方法,
下面的方法就调用起来比较简单,不用重写by跟sortby方法,但是上面的比较灵活(理解可能比下面的费劲)
package mainimport ("fmt""sort")type Person struct {Name stringWeight int}type PersonSlice []Personfunc (s PersonSlice) Len() int { return len(s) }func (s PersonSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }type ByName struct{ PersonSlice } // 将 PersonSlice 包装起来到 ByName 中func (s ByName) Less(i, j int) bool { return s.PersonSlice[i].Name < s.PersonSlice[j].Name } // 将 Less 绑定到 ByName 上type ByWeight struct{ PersonSlice } // 将 PersonSlice 包装起来到 ByWeight 中func (s ByWeight) Less(i, j int) bool { return s.PersonSlice[i].Weight < s.PersonSlice[j].Weight } // 将 Less 绑定到 ByWeight 上func main() {s := []Person{{"apple", 12},{"pear", 20},{"banana", 50},{"orange", 87},{"hello", 34},{"world", 43},}sort.Sort(ByWeight{s})fmt.Println("People by weight:")printPeople(s)sort.Sort(ByName{s})fmt.Println("\nPeople by name:")printPeople(s)}func printPeople(s []Person) {for _, o := range s {fmt.Printf("%-8s (%v)\n", o.Name, o.Weight)}}
3.sort.Slice介绍
3.1使用方法
很明显将对象抽象成interface
,而上面对对象的排序,只能是person
这种特定对象
调用的时候有点类似java的重写compare
方法
package mainimport ("fmt""sort")type Person struct {Name stringWeight int}func main() {s := []Person{{"apple", 12},{"pear", 20},{"banana", 50},{"orange", 87},{"hello", 34},{"world", 43},}//可以向上面一样对排序字段封装,加一个sortby字段传递sort.Slice(s,func(i,j int)bool{return s[i].Weight < s[j].Weight})fmt.Println("People by weight:")printPeople(s)sort.Slice(s,func(i,j int)bool{return s[i].Name < s[j].Name})fmt.Println("\nPeople by name:")printPeople(s)}func printPeople(s []Person) {for _, o := range s {fmt.Printf("%-8s (%v)\n", o.Name, o.Weight)}}
3.2运行
关于"golag如何使用sort.slice包实现对象list排序"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
排序
方法
对象
字段
面的
封装
升序
基础
篇文章
类型
三个
使用方法
例子
多个
更多
还是
分析
包装
推荐
不错
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
山东大专软件开发哪个学校好
安徽软件开发者攻略
杭州招聘网络安全专业
阳山公安网络安全管理
北京瑞迪网络技术有限公司
组策略服务器上的默认值
票务系统软件开发商
数据库监听路径
服务器版pe系统
ios软件开发如何收费
数据库原理的试题期末考试
我的世界 极限生存服务器
互联网教育黑科技
国家网络安全知识竞赛入围名单
网络运维与网络安全好学吗
广州鲁棒通网络技术
痘博士软件开发
最近关于网络安全事件
txt文本文档可以当数据库吗
商丘三年制计算机网络技术专业
上海棋牌软件开发公司
数据库设计说明书外部设计
网络技术专业毕业总结
网络安全之西游记
重大网络安全风险包括那些
软件开发人员对技能的要求
盐城师范学院的服务器地址
电影服务器类型是什么
java 简单数据库
违反网络安全法将会记入