1、前言
Go语言的map是无序的,屡次遍历map的后果可能是不同的,比方:
package mainimport ( "fmt")func Map() (result map[int]uint32) { result = map[int]uint32{} // 插入各个数据 result[24] = 240 result[17] = 170 result[9] = 90 result[11] = 110 result[55] = 550 return}func main() { mapResult := Map() // 遍历map for key, value := range mapResult { fmt.Printf("key = %v,value = %v\n", key, value) }}
第一次遍历后果如下:
第二次遍历后果如下:
能够看到两次遍历的后果是不同的
2、实现map遍历有序
2.1 key有序
思路:对key排序,再遍历key输入value
2.1.1 从小到大排序
sort.Sort(sort.IntSlice(keys))
代码如下:
package mainimport ( "fmt" "sort")func Map() (result map[int]uint32, keys []int) { result = map[int]uint32{} keys = []int{} // 插入各个数据 result[24] = 240 result[17] = 170 result[9] = 90 result[11] = 110 result[55] = 550 // 失去各个key for key := range result { keys = append(keys, key) } // 给key排序,从小到大 sort.Sort(sort.IntSlice(keys)) return}func main() { mapResult, keys := Map() // 遍历map for _, key := range keys { fmt.Printf("key = %v,value = %v\n", key, mapResult[key]) }}
后果:
2.1.2 从大到小排序
sort.Sort(sort.Reverse(sort.IntSlice(keys)))
代码如下:
package mainimport ( "fmt" "sort")func Map() (result map[int]uint32, keys []int) { result = map[int]uint32{} keys = []int{} // 插入各个数据 result[24] = 240 result[17] = 170 result[9] = 90 result[11] = 110 result[55] = 550 // 失去各个key for key := range result { keys = append(keys, key) } // 给key排序,从大到小 sort.Sort(sort.Reverse(sort.IntSlice(keys))) return}func main() { mapResult, keys := Map() // 遍历map for _, key := range keys { fmt.Printf("key = %v,value = %v\n", key, mapResult[key]) }}
后果:
2.2 value有序
用struct寄存key和value,实现sort接口,就能够调用sort.Sort进行排序了
2.2.1 从小到大排序
package mainimport ( "fmt" "sort")func main() { mapInfo := map[string]int32{ "roy":18, "kitty":16, "hugo":21, "tina":35, "jason":23, } type peroson struct { Name string Age int32 } var lstPerson []peroson for k, v := range mapInfo { lstPerson = append(lstPerson, peroson {k, v}) } sort.Slice(lstPerson, func(i, j int) bool { return lstPerson[i].Age < lstPerson[j].Age // 升序 }) fmt.Println(lstPerson)}
后果:
2.2.2 从大到小排序
package mainimport ( "fmt" "sort")func main() { mapInfo := map[string]int32{ "roy": 18, "kitty": 16, "hugo": 21, "tina": 35, "jason": 23, } type peroson struct { Name string Age int32 } var lstPerson []peroson for k, v := range mapInfo { lstPerson = append(lstPerson, peroson{k, v}) } sort.Slice(lstPerson, func(i, j int) bool { return lstPerson[i].Age > lstPerson[j].Age // 降序 }) fmt.Println(lstPerson)}
后果: