前言
有时候我们需要根据切片中的某个字段进行切片排序,但sort包中只有默认基本类型 int 、 float64 和 string 的排序,所以我们可以手动实现sort包的 sort.Interface 接口,来完成自定义排序。这个接口有三个方法 Len() 、 Less(i,j) 和 Swap(i,j) 。
1. 普通排序
a := []int{4,5,7,3,2} sort.Ints(a) fmt.Println(a)
浮点和string 可以根据 sort.Float64s(a []float64) sort.Strings(a []string) 排序
2. 切片排序,自定义实现排序
func (a Type)Len() int {} func (a Type)Less(i,j int) bool {} func (a Type)Swap(i,j int){}
type Sd struct { Id int Score float64 } type Ssd []Sd func (sd Ssd)Len() int { return len(sd) } func (sd Ssd)Less(i,j int) bool { return sd[i].Id < sd[j].Id } func (sd Ssd)Swap(i,j int){ sd[i],sd[j] = sd[j],sd[i] } func main(){ sd := Ssd{ {2,12.3}, {1,17.3}, {4,15.3}, {3,13.3}, } sort.Sort(sd) fmt.Println(sd) sort.Sort(sort.Reverse(sd)) // 按照升序排序 fmt.Println(sd) } //[{1 17.3} {2 12.3} {3 13.3} {4 15.3}]
3. 二维数组按某列排序
按照切片的操作,上面的三个方法,其实有两个方法是不管什么样的结构体都是一样的,所以sort包又给我们提供了一个通用的方法sort.Slice
type Data struct { Id int Name string Score float32 Age int High float32 } func sortByColumn(column string,data []Data) { sort.Slice(data, func(i, j int) bool { switch column { case "Id": return data[i].Id < data[j].Id case "Name": return data[i].Name < data[j].Name case "Score": return data[i].Score < data[j].Score case "Age": return data[i].Age < data[j].Age case "High": return data[i].High < data[j].High default: return data[i].Id < data[j].Id } }) } func main() { var data = []Data{ {5,"zhangsan",92,20,1.75}, {3,"lisi",100,22,1.85}, {2,"wangwu",67,19,1.65}, {4,"zhaoliu",88,21,1.71}, {1,"wuqi",90,20,1.70}, } sortByColumn("Score",data[:]) for _,v := range data { fmt.Println(v) } }
《本文》有 0 条评论