Go by Example - Sorting and Sorting by Functions

Go by Example - Sorting and Sorting by Functions

介绍go中的排序和通过函数排序

Sorting

Go 的 slices 包实现了内置类型和用户自定义类型的排序。我们先来看内置类型的排序。

sorting.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
"slices"
)

func main() {
// 排序功能是通用的,适用于任何有序内置类型
// 有关有序类型的列表,请参阅 cmp.Ordered: https://pkg.go.dev/cmp#Ordered
strs := []string{"c", "a", "b"}
slices.Sort(strs)
fmt.Println("Strings:", strs)

// ints排序示例
ints := []int{7, 2, 4}
slices.Sort(ints)
fmt.Println("Ints: ", ints)

// 我们还可以使用切片软件包来检查切片是否已经排序
s := slices.IsSorted(ints)
fmt.Println("Sorted: ", s)
}
log
1
2
3
4
$ go run sorting.go
Strings: [a b c]
Ints: [2 4 7]
Sorted: true

Sorting by Functions

有时,我们需要对一个集合进行排序,而不是按照其自然顺序。例如,假设我们想按字符串的长度排序,而不是按字母顺序排序。下面是 Go 中自定义排序的一个示例。

sorting-by-functions.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
"cmp"
"fmt"
"slices"
)

func main() {
fruits := []string{"peach", "banana", "kiwi"}

// 我们实现了一个字符串长度比较函数
// cmp.Compare 在这方面很有帮助
lenCmp := func(a, b string) int {
return cmp.Compare(len(a), len(b))
}

// 现在,我们可以使用这个自定义比较函数来调用 slices.SortFunc,按名称长度对水果进行排序
slices.SortFunc(fruits, lenCmp)
fmt.Println(fruits)

// 我们可以使用相同的技术来对非内置类型的数值片段进行排序
type Person struct {
name string
age int
}

people := []Person{
Person{name: "Jax", age: 37},
Person{name: "TJ", age: 25},
Person{name: "Alex", age: 72},
}

// 使用 slices.SortFunc 按年龄排序
slices.SortFunc(people,
func(a, b Person) int {
return cmp.Compare(a.age, b.age)
})
fmt.Println(people)
// 注意:如果Person结构很大,您可能希望切片包含*Person,并相应地调整排序函数。如果有疑问,请进行基准测试!
}
log
1
2
3
$ go run sorting-by-functions.go
[kiwi peach banana]
[{TJ 25} {Jax 37} {Alex 72}]

参考链接

作者

孤独小狼

发布于

2024-03-31

更新于

2024-03-31

许可协议

评论