Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Как отсортировать map[string]int по значению?

#сортировка #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)) Как лучше? Второй? Ведь если мы знаем размер, то наверное лучше указать?

Комментариев нет:

Отправить комментарий