文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

golang中如何按照结构体的某个字段排序

2023-06-30 17:31

关注

本文小编为大家详细介绍“golang中如何按照结构体的某个字段排序”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang中如何按照结构体的某个字段排序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

概述

golang的sort包默认支持int, float64, string的从小大到排序:

int -> Ints(x []int)
float64 -> Float64s(x []float64)
string -> Strings(x []string)

同时它还提供了自定义的排序接口Interface,此接口保护三个方法。

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)}

golang默认提供了三个类型,他们都实现了Interface:
Float64Slice
IntSlice
StringSlice

从大到小排序

方法1:先使用提供的从大到小排序,再翻转

arr := []float64{0.1, 0.5, 0.8, 0.4, 0.2}sort.Sort(sort.Reverse(sort.Float64Slice(arr)))fmt.Println(arr) // [0.8 0.5 0.4 0.2 0.1]

方法二:自定义类型实现

type Float64SliceDecrement []float64func (s Float64SliceDecrement) Len() int { return len(s) }func (s Float64SliceDecrement) Swap(i, j int) { s[i], s[j] = s[j], s[i] }func (s Float64SliceDecrement) Less(i, j int) bool { return s[i] > s[j] }func main() {arr := []float64{0.1, 0.5, 0.8, 0.4, 0.2}sort.Sort(Float64SliceDecrement(arr))fmt.Println(arr) // [0.8 0.5 0.4 0.2 0.1]}

按照结构体的某个字段排序

按年纪从大到小排序

type Persons struct {Age intHeight int}type PersonsSliceDecrement []Personsfunc (s PersonsSliceDecrement) Len() int { return len(s) }func (s PersonsSliceDecrement) Swap(i, j int) { s[i], s[j] = s[j], s[i] }func (s PersonsSliceDecrement) Less(i, j int) bool { return s[i].Age > s[j].Age }func main() {arr1 := []Persons{Persons{10, 12},Persons{20, 12},Persons{9, 12},Persons{10, 12},Persons{11, 12},}sort.Sort(PersonsSliceDecrement(arr1))fmt.Println(arr1)}

打印

[{20 12} {11 12} {10 12} {10 12} {9 12}]

按年纪从大到小,如果年纪相等的,按身高从小到到

type Persons struct {Age intHeight int}type PersonsSliceDecrement []Personsfunc (s PersonsSliceDecrement) Len() int { return len(s) }func (s PersonsSliceDecrement) Swap(i, j int) { s[i], s[j] = s[j], s[i] }func (s PersonsSliceDecrement) Less(i, j int) bool {if s[i].Age > s[j].Age {return true}if s[i].Age == s[j].Age && s[i].Height < s[j].Height {return true}return false}func main() {arr1 := []Persons{Persons{10, 120},Persons{20, 12},Persons{10, 110},Persons{10, 11},Persons{10, 100},}sort.Sort(PersonsSliceDecrement(arr1))fmt.Println(arr1)}

打印

[{20 12} {10 11} {10 100} {10 110} {10 120}]

使用 sort.Stable 进行稳定排序

sort.Sort 并不保证排序的稳定性。如果有需要, 可以使用 sort.Stable ,用法就是将sort.Sort 替换为 sort.Stable

附:go根据结构体中任意字段进行排序

附:根据结构体中任意字段进行排序

Sort()

Reverse()

Less(i,j int) bool

Len() int

Swap(i,j int)

package mainimport ("fmt""sort")type Student struct {Number   stringName     stringAge      intIsWalker boolWeight   float32}type ByNumber []*Studentfunc (this ByNumber)Len() int  {return len(this)}func (this ByNumber)Less(i,j int) bool  {return this[i].Number<this[j].Number}func (this ByNumber)Swap(i,j int) {this[i],this[j] = this[j],this[i]}func (this ByNumber) String() string {const  format = "| %v |\t%v |\t%v |\t %v |\t %v |\t%v   |\n"    fmt.Println("\t\t\t\t\t学生信息表")    fmt.Println(" 序号\t学号 \t姓名\t   年龄\t  体重\t   是否走读")for k,v:=range this{fmt.Printf(format,k+1,v.Number,v.Name,v.Age,v.Weight,v.IsWalker)}return ""}func main1() {sts:=[]*Student{&Student{Number: "003",Name: "张三"},&Student{Number: "004",Name: "张四"},&Student{Number: "001",Name: "张一"},&Student{Number: "002",Name: "张二"},&Student{Number: "000",Name: "张零"},}b:=ByNumber(sts)sort.Sort(b)fmt.Println(b)fmt.Println("反转")sort.Sort(sort.Reverse(b))  //反转的用法fmt.Println(b)//为结构体内的每一个字段都绑定一个排序的外壳,这种操作显然不是很聪明    //这时候使用组合来解决这个问题}type customSort struct {s []*Studentless func(i,j *Student)  bool}func (this *customSort)Len() int {return len(this.s)}func (this *customSort)Swap(i,j int) {this.s[i],this.s[j] = this.s[j],this.s[i]}func (this *customSort)Less(i,j int) bool {return this.less(this.s[i],this.s[j])}func main()  {sts:=[]*Student{&Student{Number: "003",Name: "张三"},&Student{Number: "004",Name: "张四"},&Student{Number: "001",Name: "张一"},&Student{Number: "000",Name: "张二"},&Student{Number: "002",Name: "张二"},}c:=&customSort{s: sts,less: func(i, j *Student) bool {if i.Number != j.Number {    //可以指定多种排序规则return i.Number>j.Number}if i.Name!=j.Name{return i.Name<j.Name}return false},}sort.Sort(c) //Sort方法中不只能放slice类型,还可以放结构体类型,只要改类型 实现 Sort接口fmt.Println(ByNumber(sts)) //单纯的使用一下ByNumber中重写是String()方法}

读到这里,这篇“golang中如何按照结构体的某个字段排序”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯