Сортировка карты по значениям в Java

Простые и понятные примеры сортировки Map по значениям с использованием Java 8 Stream APIs в порядке возрастания и убывания(обратном). В центре логики находится метод Map.Entry.comparingByValue(), который сравнивает записи карты в естественном порядке по значениям записей.

1. Карта.Запись.сравнениеПоЗначению()

В Java 8 класс Map.Entry имеет статический метод comparisonByValue() для сортировки Map по значениям. Он возвращает Comparator, который сравнивает Map.Entry в естественном порядке значений.

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

В качестве альтернативы мы можем передать пользовательский Comparator для сортировки значений в пользовательском порядке. Например, мы можем использовать Comparator.reverseOrder() для сортировки карты в обратном порядке.

map.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))...

2. Программа Java для сортировки карты по значениям

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.comparingByValue()).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 в обратном порядке.

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.comparingByValue(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

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