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