Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как отсортировать Map по ключу

Короткий ответ

TreeMap всегда хранит ключи отсортированными. Скопируйте в него любую Map:

void main() {
    Map<String, Integer> stock = Map.of("pears", 4, "apples", 10, "cherries", 7);
    IO.println(new TreeMap<>(stock));
}

Результат:

{apples=10, cherries=7, pears=4}

Обратный порядок

Передайте компаратор в конструктор TreeMap:

void main() {
    var stock = new TreeMap<String, Integer>(Comparator.reverseOrder());
    stock.putAll(Map.of("pears", 4, "apples", 10, "cherries", 7));
 
    IO.println(stock);
}

Результат:

{pears=4, cherries=7, apples=10}

Первый и последний ключ

TreeMap умеет быстро находить крайние и ближайшие ключи:

void main() {
    var rates = new TreeMap<>(Map.of(0, "free", 100, "basic", 500, "pro"));
 
    IO.println(rates.firstKey());
    IO.println(rates.floorEntry(250).getValue());
}

Результат:

0
basic

Через поток

Если TreeMap не нужна, отсортируйте пары в потоке:

void main() {
    Map<String, Integer> stock = Map.of("pears", 4, "apples", 10, "cherries", 7);
 
    stock.entrySet().stream()
            .sorted(Map.Entry.comparingByKey())
            .forEach(e -> IO.println(e.getKey() + " " + e.getValue()));
}

Результат:

apples 10
cherries 7
pears 4

Частая ошибка

Сортировать числа, записанные строками. Строки сравниваются посимвольно, поэтому "10" идёт раньше "9":

void main() {
    IO.println(new TreeMap<>(Map.of("9", "nine", "10", "ten", "100", "hundred")).keySet());
}

Результат:

[10, 100, 9]

Храните числовые ключи как Integer.

Функции из этого ответа

  • TreeMap — Словарь, ключи которого всегда отсортированы.
  • Map.Entry — Одна пара «ключ — значение» словаря.
  • Collectors.toMap() — Сборщик, который строит словарь из элементов потока.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.