目录

Golang实现有序遍历Map

目录

Go的map元素遍历顺序(使用range关键字)是随机的,而不是遵循元素的添加顺序,为解决这一问题,可使用下面的遍历方式。

 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"
    "sort"
)

func main() {
    map1 := map[int]string{
    0:	"java",
    1:	"golang",
    2:	"python",
    }

    var keys []int
    for key := range map1 {
        keys = append(keys, name)
    }
    sort.Ints(keys)
    for _, key := range keys {
        fmt.Printf("%st%dn", key, map1[key])
    }
}

可以看到,其关键思路就是先把所有Key拿出来排序,再按照排序后的进行遍历,主要用到了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
34
35
36
37
package main

import (
    "fmt"
    "sort"
)

type Person struct {
    Name string
    Age  int16
}

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() {
    people := personSlice{
        {Name: "张三", Age: 10},
        {Name: "王五", Age: 50},
        {Name: "李四", Age: 30},
    }
    sort.Sort(people)
    fmt.Println(people)
}

// [{王五 50} {李四 30} {张三 10}]

通过实现go/src/sort/sort.Interface接口,自行指定struct结构体的排序规则,这一点跟java有些类似。

评论