menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 08.5.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    08.5.md
    2.03 KB / 2024-07-16 23:14:27
        # 8.5 map 的排序
    
    `map` 默认是无序的,不管是按照 key 还是按照 value 默认都不排序(详见第 8.3 节)。
    
    如果你想为 `map` 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序(使用 `sort` 包,详见[第 7.6.6 节](07.6.md)),然后可以使用切片的 for-range 方法打印出所有的 key 和 value。
    
    下面有一个示例:
    
    示例 8.6 [sort_map.go](examples/chapter_8/sort_map.go):
    
    ```go
    // the telephone alphabet:
    package main
    import (
    	"fmt"
    	"sort"
    )
    
    var (
    	barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
    							"delta": 87, "echo": 56, "foxtrot": 12,
    							"golf": 34, "hotel": 16, "indio": 87,
    							"juliet": 65, "kili": 43, "lima": 98}
    )
    
    func main() {
    	fmt.Println("unsorted:")
    	for k, v := range barVal {
    		fmt.Printf("Key: %v, Value: %v / ", k, v)
    	}
    	keys := make([]string, len(barVal))
    	i := 0
    	for k, _ := range barVal {
    		keys[i] = k
    		i++
    	}
    	sort.Strings(keys)
    	fmt.Println()
    	fmt.Println("sorted:")
    	for _, k := range keys {
    		fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
    	}
    }
    ```
    
    输出结果:
    
    	unsorted:
    	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 /
    	sorted:
    	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 /
    
    但是如果你想要一个排序的列表,那么最好使用结构体切片,这样会更有效:
    
    ```go
    type name struct {
    	key string
    	value int
    }
    ```
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[map 类型的切片](08.4.md)
    - 下一节:[将 map 的键值对调](08.6.md)
    
    
    links
    file_download