使用golang的sort包进行排序
source link: https://www.tuicool.com/articles/y67jeaa
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
这是在掘金的第一篇文章,之前一直在某书发文章,进来感觉某书越来越不好了,想把文章 都搬到掘金来。
golang和java等语言一样,系统自带了一个排序方法,可以快速实现排序。废话不多说,先上栗子,再解释。
package main import ( "fmt" "math/rand" "sort" "strconv" ) func main() { oneArr := make([]*One, 10) for i := 0; i < 10; i++ { oneArr[i] = &One{ Name: "name" + strconv.FormatInt(int64(i), 10), Num: rand.Intn(1000), } } for _, v := range oneArr { fmt.Print(v, " ") } fmt.Println() sort.Sort(OneList(oneArr)) for _, v := range oneArr { fmt.Print(v, " ") } fmt.Println() } type One struct { Num int Name string } type OneList []*One func (this OneList) Len() int { return len(this) } func (this OneList) Less(i, j int) bool { return this[i].Num < this[j].Num } func (this OneList) Swap(i, j int) { this[i], this[j] = this[j], this[i] } 复制代码
运行结果
实现从小到大排序
使用 type
定义了一个 []*One
类型的OneList切片。OneLiit 实现 Interface
这个接口
这个接口在 sort
中定义,原型
// A type, typically a collection, that satisfies sort.Interface can be // sorted by the routines in this package. The methods require that the // elements of the collection be enumerated by an integer index. type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with indexes i and j. Swap(i, j int) } 复制代码
-
Len()
函数 返回要排序的序列的长度 -
Less()
函数 返回排序需要的比较的规则,如果符合这个规则,就进行交换 -
Swap()
函数 进行排序的交换规则
给 OneList 重写这3个函数
新建一个切片 oneArr
,随机填充数据,然后调用 sort
包中的 Sort()
函数,进行排序。
Sort()
函数需要传递一个 Interface
类型的参数。 使用强制类型转换把 oneArr
转换为 Interface
类型。
sort
包中 还有一个函数实现反向排序, sort.sort.Reverse()
可以实现倒序排序
栗子 sort.Sort(sort.Reverse(OneList(oneArr)))
就能实现反向排序
结果:
实现从大到下排序
拓展
golang的 sort
包中为我们定义了一些常用的排序类型
type IntSlice []int type Float64Slice []float64 type StringSlice []string
看一个应用栗子:
package main import ( "fmt" "math/rand" "sort" ) func main() { one := make([]int, 10) for i := 0; i < 10; i++ { one[i] = int(rand.Int31n(1000)) } fmt.Println(one) sort.Sort(sort.IntSlice(one)) fmt.Println(one) } 复制代码
运行结果:
好了,先介绍到这里。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK