Skip to content

5.9、Golang标准库-sort

sort包提供了切片排序

排序示例

go
package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []int{3, 4, 1, 2}

    sort.Ints(s)

    fmt.Printf("s: %v\n", s)
    // s: [1 2 3 4]
}

接口

go
type Interface interface {
    Len() int

    Less(i, j int) bool

    Swap(i, j int)
}

自定义排序

实现接口示例

go
package main

import (
    "fmt"
    "sort"
)

type NewInts []uint

func (n NewInts) Len() int {
    return len(n)
}

func (n NewInts) Less(i, j int) bool {
    return n[i] < n[j]
}

func (n NewInts) Swap(i, j int) {
    n[i], n[j] = n[j], n[i]
}

func main() {
    s := []uint{3, 4, 1, 2}

    sort.Sort(NewInts(s))

    fmt.Printf("s: %v\n", s)
    // s: [1 2 3 4]
}

浮点数切片

go
package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []float64{3.1, 4.2, 1.9, 2.0}

    sort.Float64s(s)

    fmt.Printf("s: %v\n", s)
    // s: [1.9 2 3.1 4.2]
}

字母字符串切片

go
package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []string{"tom", "jack", "steve"}

    sort.Strings(s)

    fmt.Printf("s: %v\n", s)
    // s: [jack steve tom]
}

数字字符串切片

go
package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []string{"23", "12", "54"}

    sort.Strings(s)

    fmt.Printf("s: %v\n", s)
    // s: [12 23 54]
}

中文字符串切片

go
package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []string{"喔", "啊", "饿"}

    sort.Strings(s)

    fmt.Printf("s: %v\n", s)
    // s: [啊 喔 饿]

    for _, v := range s {
        fmt.Printf("v: %v %v\n", v, []byte(v))
    }
    // 一个汉字占3个字节
    // v: 啊 [229 149 138]
    // v: 喔 [229 150 148]
    // v: 饿 [233 165 191]
}

二维切片排序

go
package main

import (
    "fmt"
    "sort"
)

type Array [][]int

// 实现接口
func (array Array) Len() int {
    return len(array)
}

func (array Array) Less(i, j int) bool {
    // 按照第二个值进行比较
    return array[i][1] < array[j][1]
}

func (array Array) Swap(i, j int) {
    array[i], array[j] = array[j], array[i]
}

func main() {
    s := [][]int{
        {1, 2},
        {3, 6},
        {4, 5},
    }

    sort.Sort(Array(s))

    fmt.Printf("s: %v\n", s)
    // s: [[1 2] [4 5] [3 6]]
}

map切片排序

go
package main

import (
    "fmt"
    "sort"
)

type MapSlice []map[string]int

// 实现接口
func (ml MapSlice) Len() int {
    return len(ml)
}

func (ml MapSlice) Less(i, j int) bool {
    // 按照age 年龄值进行比较
    return ml[i]["age"] < ml[j]["age"]
}

func (ml MapSlice) Swap(i, j int) {
    ml[i], ml[j] = ml[j], ml[i]
}

func main() {
    s := MapSlice{
        {"money": 10, "age": 21},
        {"money": 11, "age": 20},
        {"money": 12, "age": 22},
    }

    sort.Sort(s)

    fmt.Printf("s: %v\n", s)
    // s: [
    // map[age:20 money:11]
    // map[age:21 money:10]
    // map[age:22 money:12]
    // ]
}

结构体切片排序

go
package main

import (
    "fmt"
    "sort"
)

type People struct {
    Name string
    Age  int
}

type PeopleSlice []People

// 实现接口
func (s PeopleSlice) Len() int {
    return len(s)
}

func (s PeopleSlice) Less(i, j int) bool {
    // 按照age 年龄值进行比较
    return s[i].Age < s[j].Age
}

func (s PeopleSlice) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func main() {
    s := PeopleSlice{
        {Name: "Tom", Age: 21},
        {Name: "Jack", Age: 20},
        {Name: "Steve", Age: 22},
    }

    sort.Sort(s)

    fmt.Printf("s: %v\n", s)
    // s: [{Jack 20} {Tom 21} {Steve 22}]
}