[Golang] 实现一个通用的排序方式(对任意数据类型构成的slice排序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sc_lilei/article/details/83275837

前言:

Go 语言中排序主要使用的sort库,对于常见数据类型string, int ,float构成的Slice,可以使用sort库对应的sort.Strings() / sort.Ints() / sort.Float64s()直接排序,但是对于复杂类型struct构成的Slice,要对其排序就需要自己实现其三个方法(Len, Swap,Less)。

问题在于:一个结构体我可以给他写三个方法,那10个结构体我得写30个方法?

这一定是不合理的,办法总比困难多,本文结合 【WangC.W】-- go语言的排序、结构体排序 一文以及自己的理解实现了一台通用的golang排序写法。

正文:

package main

import (
	"fmt"
	"sort"
)

//待排序的结构体
type City struct {
	Name 	string
	Number 	int
	Test 	bool
}

//待排序的结构体
type Animal struct {
	Name 	string    // 名字
	Height  float32    // 高度
	Weight 	float32  //体重
}

//定义一个通用的结构体
type Bucket struct {
	Slice []interface{}  //承载以任意结构体为元素构成的Slice
	By func(a,b interface{})bool  //排序规则函数,当需要对新的结构体slice进行排序时,只需定义这个函数即可
}
/*
定义三个必须方法的准则:接收者不能为指针
*/
func (this Bucket)Len()int { return len(this.Slice)}

func (this Bucket)Swap(i,j int){ this.Slice[i],this.Slice[j] = this.Slice[j],this.Slice[i] }

func (this Bucket)Less(i,j int)bool { return this.By(this.Slice[i], this.Slice[j]) }


func main() {
    
    //对第一个结构体排序
	c1 := City{"Los Angeles",1024, true}
	c2 := City{"Wellington",128,false}
	c3 := City{"Seattle",64,false}

	//定义专属的排序函数
	city_by := func(a,b interface{})bool {
		return a.(City).Number > b.(City).Number   //按年龄排倒序
	}
	citys := Bucket{}
	citys.Slice = append(citys.Slice, c1,c2,c3)
	citys.By = city_by
	sort.Sort(citys)
	fmt.Printf("%+v\n", citys.Slice)


	/***************对第二个结构体排序*****************/
	a1 := Animal{"pigeon",0.15,3}
	a2 := Animal{"sheep",1,20}
	a3 := Animal{"giraffe",3,70}

	//定义结构体Animal的专属排序函数 -- 关键代码
	animal_by := func(a,b interface{})bool {
		return a.(Animal).Weight > b.(Animal).Weight  //按体重排倒序
	}
	animals := Bucket{}
	animals.Slice = append(animals.Slice, a1,a2,a3)
	animals.By = animal_by // -- 关键代码
	sort.Sort(animals) // -- 关键代码
	fmt.Printf("%+v\n", animals.Slice) //已排序的slice
}

再次感谢【WangC.W】-- go语言的排序、结构体排序 。

猜你喜欢

转载自blog.csdn.net/sc_lilei/article/details/83275837