• 8.5 map 的排序

    8.5 map 的排序

    map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序(详见第 8.3 节)。

    如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序(使用 sort 包,详见第 7.6.6 节),然后可以使用切片的 for-range 方法打印出所有的 key 和 value。

    下面有一个示例:

    示例 8.6 sort_map.go:

    1. // the telephone alphabet:
    2. package main
    3. import (
    4. "fmt"
    5. "sort"
    6. )
    7. var (
    8. barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
    9. "delta": 87, "echo": 56, "foxtrot": 12,
    10. "golf": 34, "hotel": 16, "indio": 87,
    11. "juliet": 65, "kili": 43, "lima": 98}
    12. )
    13. func main() {
    14. fmt.Println("unsorted:")
    15. for k, v := range barVal {
    16. fmt.Printf("Key: %v, Value: %v / ", k, v)
    17. }
    18. keys := make([]string, len(barVal))
    19. i := 0
    20. for k, _ := range barVal {
    21. keys[i] = k
    22. i++
    23. }
    24. sort.Strings(keys)
    25. fmt.Println()
    26. fmt.Println("sorted:")
    27. for _, k := range keys {
    28. fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
    29. }
    30. }

    输出结果:

    1. unsorted:
    2. Key: bravo, Value: 56 / Key: echo, Value: 56 / Key: indio, Value: 87 / Key: juliet, Value: 65 / Key: alpha, Value: 34 / Key: charlie, Value: 23 / Key: delta, Value: 87 / Key: foxtrot, Value: 12 / Key: golf, Value: 34 / Key: hotel, Value: 16 / Key: kili, Value: 43 / Key: lima, Value: 98 /
    3. sorted:
    4. Key: alpha, Value: 34 / Key: bravo, Value: 56 / Key: charlie, Value: 23 / Key: delta, Value: 87 / Key: echo, Value: 56 / Key: foxtrot, Value: 12 / Key: golf, Value: 34 / Key: hotel, Value: 16 / Key: indio, Value: 87 / Key: juliet, Value: 65 / Key: kili, Value: 43 / Key: lima, Value: 98 / [fangjun@st01-dstream-0001.st01.baidu.com go]$ sz -be sort_map.go

    但是如果你想要一个排序的列表你最好使用结构体切片,这样会更有效:

    1. type name struct {
    2. key string
    3. value int
    4. }