sort

寒江蓑笠翁大约 3 分钟

sort

在go中的sort包下提供了官方实现的排序方法,大部分可以直接开箱即用。倘若想要对结构体进行排序的话必须实现sort.Interface下的三个方法Len() swap() Less()。由于官方已经帮我们实现了Float64Slice StringSlice IntSlice三个类型,所以这三个类型可以不用我们自己实现直接使用即可。

type Interface interface {
   // 长度方法
   Len() int

   // 比较方法
   Less(i, j int) bool

   // 交换方法
   Swap(i, j int)
}

整型排序

func main() {
   ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
   sort.Ints(ints)
}

浮点排序

func main() {
   floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
   sort.Float64s(floats)
   fmt.Println(floats)
}

字符串排序

func main() {
   strings := []string{"helloworld", "aaa", "bbb", "ccc"}
   sort.Strings(strings)
}

逆向排序

需要先进行sort.Reverse包装再进行排序

func main() {
	floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
	sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
	fmt.Println(floats)
}

自定义排序

如果想要自定义结构体排序的话,就必须实现三个方法。

type Person struct {
	UserId   string 
	Username string 
	Age      int    
	Address  string 
}

type PersonSlice []Person

//返回切片的长度
func (p PersonSlice) Len() int {
	return len(p)
}

//比较方法
func (p PersonSlice) Less(i, j int) bool {
	return p[i].Age < p[j].Age
}

//交换方法
func (p PersonSlice) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
}

由于是根据年龄比较的,所有结果是根据年龄的大小来排序。

func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   fmt.Println(persons)
}

是否有序

判断一个切片是否有序,其内部并不会进行排序操作,而是通过循环调用Less()来判断

func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   println(sort.IsSorted(PersonSlice(persons)))
}