还是以前的笔记,上传一下
package test
import (
"fmt"
"sort"
)
func Test2() {
Ages := []int{3, 11, 45, 11, 98, 11}
Names := []string{"huangfeng", "huangfeng", "mycat", "baideng", "fanbingbing", "abc"}
CityNums := []int{1, 1, 4, 4, 7, 4}
// 创建测试用的切片
var Persons []PersonForSort
for i := range Ages {
p := PersonForSort{Age: Ages[i], Name: Names[i], CityNum: CityNums[i]}
Persons = append(Persons, p)
}
fmt.Println("原生切片 ", Persons)
//开始排序逐步添加至三个排序条件
var PersonCopy1 = make([]PersonForSort, len(Persons))
var PersonCopy2 = make([]PersonForSort, len(Persons))
copy(PersonCopy1, Persons)
copy(PersonCopy2, Persons)
// 条件一:年龄升
// 我们使用的是sort.Slice方法实现自定义排序规则
sort.Slice(Persons, func(i, j int) bool {
return Persons[i].Age < Persons[j].Age
})
// 查看第一次排序的结果
fmt.Println("条件一的结果 ", Persons)
// 条件二:年龄升序,年龄相同则按照城市代码降序
sort.Slice(PersonCopy1, func(i, j int) bool {
return PersonCopy1[i].Age < PersonCopy1[j].Age || (PersonCopy1[i].Age == PersonCopy1[j].Age && PersonCopy1[i].CityNum > PersonCopy1[j].CityNum)
})
// 查看第二次排序的结果
fmt.Println("条件二的结果 ", PersonCopy1)
// 条件三:年龄升序,相同则按照城市代码降序,再相同则按照名字字典序升序
sort.Slice(PersonCopy2, func(i, j int) bool {
return PersonCopy2[i].Age < PersonCopy2[j].Age ||
PersonCopy2[i].Age == PersonCopy2[j].Age && PersonCopy2[i].CityNum > PersonCopy2[j].CityNum ||
PersonCopy2[i].Age == PersonCopy2[j].Age && PersonCopy2[i].CityNum == PersonCopy2[j].CityNum && PersonCopy2[i].Name < PersonCopy2[j].Name
})
// 查看第二次排序的结果
fmt.Println("条件三的结果 ", PersonCopy2)
}
// 创建一些用于排序的机构体
type PersonForSort struct {
Age int
Name string
CityNum int
}
// 原生切片 [{3 huangfeng 1} {11 huangfeng 1} {45 mycat 4} {11 baideng 4} {98 fanbingbing 7} {11 abc 4}]
// 条件一的结果 [{3 huangfeng 1} {11 huangfeng 1} {11 baideng 4} {11 abc 4} {45 mycat 4} {98 fanbingbing 7}]
// 条件二的结果 [{3 huangfeng 1} {11 baideng 4} {11 abc 4} {11 huangfeng 1} {45 mycat 4} {98 fanbingbing 7}]
// 条件三的结果 [{3 huangfeng 1} {11 abc 4} {11 baideng 4} {11 huangfeng 1} {45 mycat 4} {98 fanbingbing 7}]