golang 排序任意数据结构
使用 sort.Sort() 或者 sort.Stable() 函数可完成对任意类型元素的排序。
一个内置的排序算法需要知道三个东西:序列的长度,表示两个元素比较的结果,一种交换两个元素的方式;这就是 sort.Interface 的三个方法:
type Interface interface {
Len() int
Less(i, j int) bool // i, j 是元素的索引
Swap(i, j int)
}
这种方法相较于前面介绍的两种排序,用起来稍微麻烦了点,因为需要用户自定义的东西更多了,不过带来的好处也是显而易见的,更加普适。
还是以学生排序为例,在自定义的结构体上实现 srot.Interface 接口。
type Student struct {
Name string
Age int
Height int
}
// ByAgeHeight 实现 sort.Interface 接口
type ByAgeHeight []Student
func (a ByAgeHeight) Len() int { return len(a) }
// Less 先用年龄排序,年龄相等再用身高排
func (a ByAgeHeight) Less(i, j int) bool {
if a[i].Age < a[j].Age {
return true
}
if a[i].Age > a[j].Age {
return false
}
return a[i].Height < a[j].Height
}
func (a ByAgeHeight) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func main() {
slStdnt := []Student{
{"Alice", 23, 175},
{"David", 18, 185},
{"Eve", 18, 165},
{"Bob", 25, 170},
}
sort.Stable(ByAgeHeight(slStdnt))
fmt.Println(slStdnt)
}
运行输出:
[{Eve 18 165} {David 18 185} {Alice 23 175} {Bob 25 170}]

