Сортировка ключей map

Messages
1,608
Reaction score
288
Website
tehadm.ru
Мапы в Go являются неупорядоченными коллекциями. Это означает, что при переборе ключей мапы определенный порядок не гарантирован. А как же получить ключи мапы в определенном порядке? Для этого можно создать слайс ключей мапы, отсортировать его и с его помощью получить значения мапы для каждого из ключей. Давайте посмотрим на пример кода, где будет описана функция, которая принимает мапу и возвращает отсортированный слайс ключей этой мапы:

C-like:
package main

import (
    "fmt"
    "sort"
)

func getSortedKeys(collection map[string]string) []string {
    // создаем пустой слайс нулевой длины, в который будем добавлять ключи мапы
    keys := make([]string, 0)
    // перебираем ключи мапы, чтобы добавить их в созданный пустой слайс keys
    for key := range collection {
        keys = append(keys, key)
    }
    // сортируем слайс, используя функцию Strings из пакета sort
    sort.Strings(keys)
    // возвращаем отсортированный слайс
    return keys
}

// теперь можео использовать этот отсортированный слайс для доступа к значениям мапы

func main() {
    // слачала объявим мапу - это будут покемоны. Ключи - имена, значения - тип покемона
    pokemons := map[string]string {
        "СПРИГАТИТО": "Травяной",
        "ФЛОРАГАТО": "Травяной",
        "МЯУСКАРАДА": "Травяной",
        "ФУЕКОКО": "Огненный",
        "КРОКАЛОР": "Огненный",
        "ЛЕЧОНК": "Нормальный",
        "ПАВМИ": "Электрический",
    }

    // сначала выведем всех покемонов как есть, перебирая ключи и значения мапы
    for key, val := range pokemons {
        fmt.Println("Покемон:", key, "тип покемона:", val)
    }
    
    fmt.Println("______________________________________________")

    // получаем отсортированный слайс ключей, вызвав функцию getSortedKey()
    pokemonsNames := getSortedKeys(pokemons)

    // выводим в алфавитном порядке имена покемонов с их типом
    // перебираем слайс
    for _, name := range pokemonsNames {
        fmt.Println("Покемон:", name, "тип покемона:", pokemons[name])
    }
}
 
C-like:
package main

import (
    "fmt"
    "sort"
)

func getSortedKeys(coll map[int]string) []int {
    arrSlice := make([]int, 0)

    for key := range coll {
        arrSlice = append(arrSlice, key)
    }

    sort.Ints(arrSlice)
    return arrSlice
}

func main() {
    moves := map[int]string{
        1991: "Терминатор 2: Судный день",
        1984: "Терминатор",
        2009: "Терминатор: Да придет спаситель",
        2003: "Терминатор 3: Восстание машин",
        2015: "Терминатор: Генезис",
        2019: "Терминатор: Темные судьбы",
    }

    sortedMoves := getSortedKeys(moves)

    fmt.Println("Как смотреть франшизу Терминатор")

    fmt.Println()

    for _, year := range sortedMoves {
        fmt.Println("Год:", year, "Фильм:", moves[year])
    }
}
 
Back
Top