之前在处理以结构体作为切片类型的问题里,如果可以对切片进行排序,则可以使问题简化许多。因为结构体有很多字段,既有字符字段又有数值字段,可以考虑通过实现 golang sort.Sort 的接口对结构体切片进行排序。
假设结构体切片如下:
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
| type Node struct {
Data string
Weight int
Length float64
}
type NodeSlice []Node
func main() {
node := make(NodeSlice, 0)
a := Node{
Data: "A",
Weight: 12,
Length: 90,
}
b := Node{
Data: "B",
Weight: 17,
Length: 26.2,
}
c := Node{
Data: "C",
Weight: 5,
Length: 1.2,
}
d := Node{
Data: "D",
Weight: 8,
Length: 22,
}
node = append(node, a, b, c, d)
}
|
现在以 Weight 作为关键词来对 node 进行排序。
首先需要导入 sort 包,并且需要以 NodeSlice 类型作为接收者 (reciver) 实现 Len()
,Swap(i, j int)
,Less(i,j int)
三个方法。
1
2
3
4
5
6
7
8
9
| func (ns NodeSlice) Len() int {
return len(ns)
}
func (ns NodeSlice) Swap(i, j int) {
ns[i], ns[j] = ns[j], ns[i]
}
func (ns NodeSlice) Less(i, j int) bool {
return ns[i].Weight < ns[j].Weight
}
|
然后你就可以调用 sort.Sort 来对该类型的切片进行排序了,默认是从小到大:
1
2
3
| fmt.Println(node)
sort.Sort(node)
fmt.Println(node)
|
打印结果如下:
[{A 12 90} {B 17 26.2} {C 5 1.2} {D 8 22}]
[{C 5 1.2} {D 8 22} {A 12 90} {B 17 26.2}]
如果需要从大到小进行打印,只需要将 sort.Sort(node)
替换为 sort.Sort(sort.Reverse(node))
。
如果需要以其他参数作为关键词进行排序,只需要调整实现的 Less
方法的关键词即可。