Учитывая этот блок кода
map[string]int {"hello":10, "foo":20, "bar":20}
Я хотел бы распечатать
foo, 20
bar, 20
hello, 10
В порядке от самого высокого до самого низкого
Благодаря!
sorting
dictionary
go
Самол
источник
источник
Less
что возвращает неверный результат. Для обратной сортировки используйте>
.sort.Reverse
. +1.В go 1.8 есть новая функция sort.Slice, так что теперь это проще.
package main import ( "fmt" "sort" ) func main() { m := map[string]int{ "something": 10, "yo": 20, "blah": 20, } type kv struct { Key string Value int } var ss []kv for k, v := range m { ss = append(ss, kv{k, v}) } sort.Slice(ss, func(i, j int) bool { return ss[i].Value > ss[j].Value }) for _, kv := range ss { fmt.Printf("%s, %d\n", kv.Key, kv.Value) } }
https://play.golang.org/p/y1_WBENH4N
источник
Например:
package main import ( "fmt" "sort" ) func main() { m := map[string]int{"hello": 10, "foo": 20, "bar": 20} n := map[int][]string{} var a []int for k, v := range m { n[v] = append(n[v], k) } for k := range n { a = append(a, k) } sort.Sort(sort.Reverse(sort.IntSlice(a))) for _, k := range a { for _, s := range n[k] { fmt.Printf("%s, %d\n", s, k) } } }
Игровая площадка
Вывод:
foo, 20 bar, 20 hello, 10
источник
Мне часто нужно отсортировать
map[string]int
то, что я считаю, и я использовал следующее.func rankMapStringInt(values map[string]int) []string { type kv struct { Key string Value int } var ss []kv for k, v := range values { ss = append(ss, kv{k, v}) } sort.Slice(ss, func(i, j int) bool { return ss[i].Value > ss[j].Value }) ranked := make([]string, len(values)) for i, kv := range ss { ranked[i] = kv.Key } return ranked }
Используйте его для перебора ключей в порядке значений
values := map[string]int{"foo": 10, "bar": 20, "baz": 1} for i, index := range rankMapStringInt(values) { fmt.Printf("%3d: %s -> %d", i, index, values[index]) }
источник
В моем случае я имел дело с программой, которую создал. В этой программе я создал карту, как и вы, с помощью
string
иint
. Затем я, как и вы, обнаружил, что в Go нет встроенного способа отсортировать что-то подобное. Я прочитал другие ответы, и мне не очень понравилось то, что я прочитал.Поэтому я попытался по-другому взглянуть на проблему. В Go можно использовать sort.Ints с срезом. Кроме того, Go может использовать sort.Slice с настраиваемым компаратором. Поэтому вместо создания карты из
string
иint
я создалstruct
изstring
иint
. Затем вы можете отсортировать:package main import ( "fmt" "sort" ) type File struct { Name string Size int } func main() { a := []File{{"april.txt", 9}, {"may.txt", 7}} f := func (n, n1 int) bool { return a[n].Size < a[n1].Size } sort.Slice(a, f) fmt.Println(a) }
Это не сработает для всех, потому что, возможно, вам придется иметь дело с картой, созданной кем-то другим. Но мне это пригодилось. Хорошая часть заключается в том, что, в отличие от всех других ответов, в этом нет циклов.
источник
Сначала отсортируйте ключи по значению, а затем выполните итерацию карты:
package main import ( "fmt" "sort" ) func main() { counts := map[string]int{"hello": 10, "foo": 20, "bar": 20} keys := make([]string, 0, len(counts)) for key := range counts { keys = append(keys, key) } sort.Slice(keys, func(i, j int) bool { return counts[keys[i]] > counts[keys[j]] }) for _, key := range keys { fmt.Printf("%s, %d\n", key, counts[key]) } }
источник