Golang笔记|map的有序遍历

248 阅读1分钟

Go语言中的map是一个无序的键值对集合,其键是唯一的,可通过键快速检索到值。

1. 初始化一个map集合

m := map[string]int{
   "a": 2,
   "b": 1,
   "c": 3,
}

for k, v := range m {
   fmt.Println(k, v)
}

由于map是无序的,此段代码每次运行结果都是不一样的

image.png

image.png

2. 对map进行有序输出

从小到大排序

其实现原理是先对集合的key(键)进行排序,再根据排序好的键进行遍历输出

m := map[string]int{
   "a": 2,
   "b": 1,
   "c": 3,
}
keys := make([]string, 0, len(m))
for k := range m {
   keys = append(keys, k)
}
// 从小到大排序
sort.Strings(keys)

for _, k := range keys {
   fmt.Println(k, m[k])
}

由于键是英文字母,其排序规则是根据字母进行排序

从大到小排序

m := map[string]int{
   "a": 2,
   "b": 1,
   "c": 3,
}
keys := make([]string, 0, len(m))
for k := range m {
   keys = append(keys, k)
}
// 从大到小排序
sort.Sort(sort.Reverse(sort.StringSlice(keys)))

for _, k := range keys {
   fmt.Println(k, m[k])
}

自定义排序 sort.Slice

arr := []int{7, 4, 10, 6, 1, 2, 9, 3, 5, 8}

通过sort.Slice 将上方数组进行从大到小排序

arr := []int{7, 4, 10, 6, 1, 2, 9, 3, 5, 8}
sort.Slice(arr, func(i, j int) bool {
   return arr[i] > arr[j]
})
fmt.Println(arr)

输出结果:

image.png