golang 排序任意数据结构

作者: adm 分类: go 发布时间: 2022-08-25

使用 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}]

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!