Golang sort 包使用

2019-06-14 20:46:36 浏览数 (1)

1.sort包简介

Golang 中的标准库 sort 包为切片及用户定义的集合的排序操作提供了原语。sort包提供了对内置类型切片的排序支持,如 []int切片、[]float64切片和[]string切片。如果需要对自定义struct类型切片进行排序,需要实现接口sort.Interface的三个方法。

代码语言:javascript复制
type Interface interface {
    // Len 为集合内元素的总数
    Len() int
	
    // Less 返回索引为 i 的元素是否应排在索引为 j 的元素之前。
    Less(i, j int) bool
	
    // Swap 交换索引为 i 和 j 的元素
    Swap(i, j int)
}

2.内置类型切片排序

代码语言:javascript复制
//整数排序
ages := []int{2, 1, 5, 66, 55, 23}
sort.Ints(ages)
fmt.Println(ages)

//浮点数排序
float64Slice :=[]float64{1.1, 4.4, 2.2, 3.3, 5.5, 6.6}
sort.Float64s(float64Slice)
fmt.Println(float64Slice)

//字符串排序
names := []string{"Hello", "World", "private", "folders", "Users", "workspace"}
sort.Strings(names)
fmt.Println(value)

输出结果:

代码语言:javascript复制
[1 2 5 23 55 66]
[1.1 2.2 3.3 4.4 5.5 6.6]
[Hello Users World folders private workspace]

如果想降序排序,需要借助 sort.Reverse() 函数。以[]int切片为例。

代码语言:javascript复制
ages := []int{2, 1, 5, 66, 55, 23}
sort.Sort(sort.Reverse(sort.IntSlice(ages)))
fmt.Println(ages)

输出结果:

代码语言:javascript复制
[66 55 23 5 2 1]

3.自定义struct类型切片的排序

根据自定义 struct Person 中的字段 bIsBefore 和 Age 进行排序,示例代码如下:

代码语言:javascript复制
package main

import (
    "fmt"
    "sort"
)

type Person struct {
    Name string
    Age  int 
    bIsBefore bool
}

// ByAge implements sort.Interface for []Person based on the bIsBefore and Age field.
type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { 
        if a[i].bIsBefore {
                return true
        }   
        if a[j].bIsBefore {
                return false
        }   
        return a[i].Age > a[j].Age 
}

func main() {
    people := []Person{
        {"Bob", 31, true},
        {"John", 42, false},
        {"Michael", 17, false},
        {"Jenny", 42, false},
        {"Dable", 42, false},
        {"Dongdong", 25, false},
        {"Tommy", 42, false},
    }   

    fmt.Println(people)
    sort.Sort(ByAge(people))
    fmt.Println(people)
}

输出结果:

代码语言:javascript复制
[{John 42 false} {Dable 42 false} {Michael 17 false} {Jenny 42 false} {King 13 false} {Tommy 50 false} {Bob 31 true}]
[{Bob 31 true} {Tommy 50 false} {Dable 42 false} {Jenny 42 false} {John 42 false} {Michael 17 false} {King 13 false}]

从排序结果可以看出,通过 sort.Sort() 进行排序,原本 John 在相等的 Dable 和 Jenny 前面,排序后出现在 Dable 和 Jenny 的后面,可见 sort.Sort() 是不稳定排序。如果想实现稳定排序,使用 sort.Stable(),排序结果如下:

代码语言:javascript复制
[{John 42 false} {Dable 42 false} {Michael 17 false} {Jenny 42 false} {King 13 false} {Tommy 50 false} {Bob 31 true}]
[{Bob 31 true} {Tommy 50 false} {John 42 false} {Dable 42 false} {Jenny 42 false} {Michael 17 false} {King 13 false}]

参考文献

[1]Package sort

0 人点赞