Go语言map排序
一、按照key排序
按照key排序先要取出map中的key放入切片中,将切片排序后再取出value。
import ( "fmt" "sort" ) func main() { m := map[int]string{ 1: "hello", 123: "my", 456: "homepage", 11: "gopher", 34: "welcome", 45: "to", } var s []int // 将key取出并放入s for k := range m { s = append(s, k) } // 将s排序 sort.Ints(s) // 取出value for _, k := range s { fmt.Printf("key = %d, value = %s\n", k, m[k]) } } // key = 1, value = hello // key = 11, value = gopher // key = 34, value = welcome // key = 45, value = to // key = 123, value = my // key = 456, value = homepage
二、按照value排序
按照value排序也是先要取出map中的key放入切片中,将切片按照value排序(用到sort.Slice()函数)后再取出value。
import ( "fmt" "sort" ) func main() { m := map[int]string{ 1: "a", 2: "c", 3: "e", 4: "b", 5: "d", 6: "f", } keys := make([]int, 0, len(m)) // 取出key for k := range m { keys = append(keys, k) } // 将key按照value进行排序 sort.Slice(keys, func(i, j int) bool { return m[keys[i]] < m[keys[j]] }) for _, k := range keys { fmt.Printf("key = %d, value = %s\n", k, m[k]) } } // key = 1, value = a // key = 4, value = b // key = 2, value = c // key = 5, value = d // key = 3, value = e // key = 6, value = f
记得以前刷题遇到过一个题目:计算给定字符串中字符出现的次数并按照降序排序。
根据上例,我们可以很容易写出方案:
import ( "fmt" "sort" ) func main() { str := "goMapSortCase" m := make(map[string]int) s := make([]string, 0, len(str)) for _, v := range str { m[string(v)]++ } for k := range m { s = append(s, k) } sort.Slice(s, func(i, j int) bool { return m[s[i]] > m[s[j]] }) for _, key := range s { fmt.Printf("%s %d;", key, m[key]) } } // o 2;a 2;p 1;r 1;s 1;e 1;g 1;M 1;S 1;t 1;C 1;