Простые и быстрые в использовании примеры сортировки карты по ключам с использованием 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}