47

使用golang的sort包进行排序

 4 years ago
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]
}
复制代码

运行结果

6ruYr27.png!web

实现从小到大排序

使用 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))) 就能实现反向排序

结果:

AziAfur.png!web

实现从大到下排序

拓展

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)

}
复制代码

运行结果:

VvaMBjn.png!web

好了,先介绍到这里。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK