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

results matching ""

    No results matching ""