#сортировка #golang
Как отсортировать map в Go по убыванию значений? Пример: map[string]int{"value1": 10, "value2": 20,"value3": 30}
Ответы
Ответ 1
Ну смотрите вы можете преобразовать map к массиву определенной структуры []struct и потому использовать функцию sort.Slice. Пример (playground): m := map[string]int{"value1": 10, "value2": 20,"value3": 30} type key_value struct { Key string Value int } var sorted_struct []key_value for key, value := range m { sorted_struct = append(sorted_struct , key_value {key, value}) } sort.Slice(sorted_struct , func(i, j int) bool { return sorted_struct[i].Value > sorted_struct[j].Value }) for _, key_value := range sorted_struct { fmt.Printf("%s, %d\n", key_value.Key, key_value.Value) } //OUTPUT: //value3, 30 //value2, 20 //value1, 10 Преобразовать отсортированный массив определенной структуры к map, можно следующим образом. Преобразование []struct к map yourMap := structs.Map(sortedStructArray) Но для этого надо подключить пакет structs.Ответ 2
Мапы в го не имеют определённой сортировки. A map is an unordered group of elements of one type, called the element type, indexed by a set of unique keys of another type, called the key type. (…) Вам надо будет достать все значения и ключи и отсортировать их с помощью пакета sort: m := map[string]int{"value1": 10, "value2": 20, "value3": 30} type kv struct { k string v int } kvs := make([]kv, 0, len(m)) for k, v := range m { kvs = append(kvs, kv{k, v}) } sort.Slice(kvs, func(i, j int) bool { return kvs[i].v > kvs[j].v }) fmt.Println(kvs) Playground: https://play.golang.org/p/bk8vaGJRiou.Ответ 3
Примеры очень похожи, практически идентичны, но! В одном случае создание слайса структур выполнено var sorted_struct []key_value а во втором kvs := make([]kv, 0, len(m)) Как лучше? Второй? Ведь если мы знаем размер, то наверное лучше указать?
Комментариев нет:
Отправить комментарий