首页 > golang > go语言中常用的功能之七(二维数组按某列排序)
2023
08-09

go语言中常用的功能之七(二维数组按某列排序)

前言

有时候我们需要根据切片中的某个字段进行切片排序,但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 条评论

留下一个回复