Сортировка карты по ключам в Java

Простые и быстрые в использовании примеры сортировки карты по ключам с использованием APITreeMap и Stream в порядке возрастания и убывания(обратном).

1. Использование TreeMap

Java TreeMap хранит записи карты в соответствии с естественным порядком ее ключей или с помощью Comparator, предоставленного во время создания карты. Обратите внимание, что TreeMap не синхронизирован, поэтому используйте его осторожно в параллельных сценариях.

1.1. По возрастанию или по умолчанию

По умолчанию все пары ключ-значение в TreeMap сортируются в их естественном порядке. Чтобы отсортировать записи Map в естественном порядке по умолчанию, добавьте все записи из несортированной Map в TreeMap.

Map<String, Integer> unsortedMap = Map.of("a", 1, "c", 3, "b", 2, "e", 5, "d", 4);Map<String, Integer> sortedTreeMap = new TreeMap<>(unsortedMap);System.out.println(sortedTreeMap);

Вывод программы.

{a=1, b=2, c=3, d=4, e=5}

1.2. По убыванию или в обратном порядке

Чтобы выполнить обратную сортировку записей карты по значениям, передайте Collections.reverseOrder() в конструктор TreeMap.

Map<String, Integer> unsortedMap = Map.of("a", 1, "c", 3, "b", 2, "e", 5, "d", 4);Map<String, Integer> sortedTreeMap = new TreeMap<>(Comparator.reverseOrder());sortedTreeMap.putAll(unsortedMap);System.out.println(sortedTreeMap);

Вывод программы.

{e=5, d=4, c=3, b=2, a=1}

2. Использование потоков Java

Начиная с Java 8, класс Map.Entry имеет статический метод comparisonByKey(), который возвращает Comparator, сравнивающий записи Map в естественном порядке ключей. Этот Comparator можно использовать с методом Stream.sorted() для сортировки потока записей Map.

map.entrySet().stream().sorted(Map.Entry.comparingByKey())...

2.1. По возрастанию

Следующая программа Java сортирует записи Map по ключам в естественном порядке и собирает отсортированные записи в LinkedHashMap. Мы собираем записи в LinkedHashMap, поскольку он поддерживает порядок вставки.

Map<String, Integer> unsortedMap = Map.of("a", 1, "c", 3, "b", 2, "e", 5, "d", 4);LinkedHashMap<String, Integer> sortedMap = unsortedMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(oldValue, newValue) -> oldValue, LinkedHashMap::new));System.out.println(sortedMap);

Вывод программы.

{a=1, b=2, c=3, d=4, e=5}

2.2. По убыванию

Используйте Comparator.reverseOrder() вместе с Map.Entry.comparingByKey(), чтобы изменить порядок элементов Map.Entry на обратный.

Map<String, Integer> unsortedMap = Map.of("a", 1, "c", 3, "b", 2, "e", 5, "d", 4);LinkedHashMap<String, Integer> sortedMap = unsortedMap.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(oldValue, newValue) -> oldValue, LinkedHashMap::new));System.out.println(sortedMap);

Вывод программы.

{e=5, d=4, c=3, b=2, a=1}

Исходный код на Github

Прокрутить вверх