1.1.1. 一、实现集合(也就是切片)排序的思路。
golang的sort包里面有个func Sort(data Interface) 函数
。文档: https://golang.org/pkg/sort/#Sort。这个函数参数是一个接口。只要我们自定义的类型实现了这个接口。就可以使用这个方法排序。接口的定义如下:
type Interface interface {
// 集合中元素个数
Len() int
// 下标是 i 的元素是否在下标是 j 的元素之前排序。
Less(i, j int) bool
// 交互下标是 i 和 j 的元素。
Swap(i, j int)
}
说明:
1、
Less(i, j int) bool
说明了集合的 i 元素是否应该大于集合的 j 元素。如果返回true 表示升序;返回false表示降序。2、
Swap(i, j int)
需要实现 i 和 j 的元素的交换。
1.1.2. 二、实现排序。
示例:把Student结构体的切片按照年龄升序排列。
type Student struct {
Name string
Age int
}
//声明Student的切片类型
type StuSlice []Student
//实现 Len() 方法
func (ss StuSlice) Len() int {
return len(ss)
}
//实现 Less 方法,按年龄从小到大排序
func (ss StuSlice) Less(i, j int) bool {
return ss[i].Age < ss[j].Age
//可以修改成对 Name 排序
//return ss[i].Name < ss[j].Name
}
// 实现 Swap 方法,交换元素
func (ss StuSlice) Swap(i, j int) {
temp := ss[i]
ss[i] = ss[j]
ss[j] = temp
//下面的一句话等价于三句话
//ss[i], ss[j] = ss[j], ss[i]
}
func main() {
var stus StuSlice
stus = append(stus,
Student{"张三",23},
Student{"李四",17},
Student{"王x",90},
)
//调用排序,因为StuSlice实现了接口参数
sort.Sort(stus);
// [{李四 17} {张三 23} {王x 90}]
fmt.Println(stus)
}
说明:
1、重点是切片要实现排序接口的3个方法。
2、交换元素可以使用一个语句就行:
ss[i], ss[j] = ss[j], ss[i]
示例如下:
i := 10 j := 20 i, j = j, i fmt.Println("i=", i, "j=", j) // i=20 j = 10