Go+自定义排序教程(4.2)

本文介绍了如何在Go中实现自定义排序,包括定义结构体并实现接口来设定排序规则,通过实例展示了按多个字段优先级排序、奇偶排序以及分数等级排序的方法,提供了在线运行的示例代码。
摘要由CSDN通过智能技术生成

Go+自定义排序

自定义排序要求待排序的对象实现sort.Interface接口,只要实现一下三个方法即可

Len() int           // 需要排序的集合的长度
Less(i, j int) bool // 比较i位置和j位置元素顺序
Swap(i, j int)      // 替换i位置和j位置元素

最简单排序示例就是定义一个struct,分别实现以上三个方法,即可使用sort.Sort排序,其中Less函数是定义排序规则的方法,这里可以决定两个比较元素的顺序,返回true代表不用交换,返回false则需要交换位置

import (
  "fmt"
  "sort"
)

// Student 学生struct
type Student struct {
  Name         string
  Age          int
  EnglishScore int
  MathScore    int
}

// OrderByAge Student数组的别名,用于实现sort.Interface接口
// OrderByAge 可以直接使用sort.Sort来排序
type OrderByAge []Student
func (a OrderByAge) Len() int           { return len(a) }
func (a OrderByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a OrderByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }

students := []Student{
  { Name: "Lilei", Age: 18, EnglishScore: 78, MathScore: 79 },
  { Name: "Hanmeimei", Age: 17, EnglishScore: 79, MathScore: 99 },
  { Name: "Hetingting", Age: 19, EnglishScore: 71, MathScore: 68 },
}

println "students:", students

// 对students进行Age字段排序
sort.Sort(OrderByAge(students))
println "by age  :", students

程序会有以下输出

students: [{Lilei 18 78 79} {Hanmeimei 17 79 99} {Hetingting 19 71 68}]
by age  : [{Hanmeimei 17 79 99} {Lilei 18 78 79} {Hetingting 19 71 68}]

在线运行

如果想灵活的排序字段可以使用排序函数的别名,然后声明多种不同规则的排序函数,首先有两个主要struct,一个是OrderBy,它是排序函数的别名,用于转换不同类型的排序,另一个是排序器StudentSorter,它是内部有待排序数据和对应的排序规则函数OrderBy,同时StudentSorter实现了sort.Interface接口,可以使用sort.Sort排序

import (
  "fmt"
  "sort"
)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值