Как отсортировать map по значению java
Отсортировать мап по значению можно преобразовав ее в LinkedHashMap или TreeMap :
import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; import java.util.stream.Collectors; public class App public static void main(String[] args) MapString, Integer> myMap = Map.of("Ivan", 2000, "Petr", 1990, "Egor", 1995); MapString, Integer> sortedMap1 = myMap.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new )); System.out.println(sortedMap1); // => MapString, Integer> sortedMap2 = new TreeMapString, Integer>( Comparator.comparing(myMap::get)); sortedMap2.putAll(myMap); System.out.println(sortedMap2); // => > >
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Как отсортировать HashMap по значению в Java
В этом руководстве мы рассмотрим, как отсортировать HashMap по значению в Java. Давайте продолжим и создадим простую HashMap: Map unsortedMap = новая HashMap (); unsortedMap.put ("Джон", 21); unsortedMap.put («Мария», 34); unsortedMap.put («Отметка», 31); unsortedMap.put ("Сидней", 24); unsortedMap.entrySet (). forEach (System.out :: println); У нас есть строки как ключи и целые числа как значения. И мы хотели бы отсортировать эту карту по значениям. HashMaps не гарантирует поддержание порядка
Время чтения: 3 мин.
В этом руководстве мы рассмотрим, как отсортировать HashMap по значению в Java .
Давайте продолжим и создадим простую HashMap :
Map unsortedMap = new HashMap(); unsortedMap.put("John", 21); unsortedMap.put("Maria", 34); unsortedMap.put("Mark", 31); unsortedMap.put("Sydney", 24); unsortedMap.entrySet().forEach(System.out::println);
У нас есть String качестве ключей и Integer качестве значений. И мы хотели бы отсортировать эту карту по значениям.
HashMap в любом случае не гарантирует сохранения порядка элементов. Порядок может меняться со временем, и они определенно не будут напечатаны обратно в порядке вставки:
John=21 Mark=31 Maria=34 Sydney=24
Если вы повторно запустите эту программу, она сохранит этот порядок, поскольку HashMap упорядочивает свои элементы по ячейкам на основе хэш-значения ключей. При печати значений из HashMap его содержимое печатается последовательно, поэтому результаты останутся такими же, если мы повторно запустим программу несколько раз.
Примечание. TreeMap расширяет SortedMap , в отличие от реализации HashMap TreeMap s предназначены для отсортированного аналога, однако, TreeMap S только сортировать по ключам, учитывая компаратор.
Сортировка HashMap по значению с помощью LinkedHashMap
LinkedHashMap сохраняет порядок вставки. Он хранит двусвязный список всех записей, что позволяет вам очень естественно обращаться к его элементам и перебирать их.
Итак, самый простой способ преобразовать несортированный HashMap в LinkedHashMap — это добавить элементы в том порядке, в котором мы хотели бы, чтобы они располагались.
Сортировка HashMap в порядке возрастания
Чтобы отсортировать unsortedMap мы видели ранее, мы создадим новую LinkedHashMap чтобы разместить элементы в том порядке, в котором мы хотим, чтобы они располагались.
Начнем с сортировки HashMap в порядке возрастания:
Map sortedMap = unsortedMap.entrySet().stream() .sorted(Comparator.comparingInt(e -> e.getValue())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> < throw new AssertionError(); >, LinkedHashMap::new )); sortedMap.entrySet().forEach(System.out::println);
То , что мы сделали здесь потоковый unsortedMap набора «s из Map.Entry объектов. Затем, используя метод sorted() , мы можем использовать различные Comparator чтобы указать, как сравниваются записи.
Поскольку мы имеем дело с простыми целыми числами, мы можем легко использовать Comparator.comparingInt() и передать лямбда-выражение . С помощью этого выражения мы передаем ключ сортировки из типа T (в нашем случае Integer ). Затем этот метод возвращает Comparator который сравнивает этот ключ сортировки.
После того, как они сортируются, мы можем collect() их в новую карту, через Collectors.toMap() вызова, где мы используем тот же Map.Entry::getKey и Map.Entry::getValue , как в unsortedMap .
Наконец, создается новый LinkedHashMap , в который вставляются все эти элементы в отсортированном порядке.
Выполнение этого кода приводит к:
John=21 Sydney=24 Mark=31 Maria=34
В качестве альтернативы вместо Comparator.comparingInt() вы можете использовать Map.Entry.comparingByValue() :
Map sortedMap = unsortedMap.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> < throw new AssertionError(); >, LinkedHashMap::new )); sortedMap.entrySet().forEach(System.out::println);
Однако при таком подходе вы не можете указать собственную логику для сравнений. Сопоставимые значения, такие как целые числа, сортируются с помощью внутренней реализации. Однако вы можете указать настраиваемый объект и указать свою собственную логику сравнения в этом классе.
Аналогично этому, вы также можете просто использовать Map.Entry::getValue :
Map sortedMap = unsortedMap.entrySet().stream() .sorted(Comparator.comparingInt(Map.Entry::getValue)) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> < throw new AssertionError(); >, LinkedHashMap::new )); sortedMap.entrySet().forEach(System.out::println);
Это также возвращает:
John=21 Sydney=24 Mark=31 Maria=34
Этот функционально точно такой же, как и предыдущий, поскольку Map.Entry.comparingByValue() в любом случае использует метод getValue() для сравнения записей.
Сортировка HashMap в порядке убывания
Теперь давайте отсортируем несортированный HashMap в порядке убывания. Единственное отличие, которое вам нужно сделать, — это лямбда-выражение, которое мы предоставили Comparator.comparingInt() — вместо этого мы просто используем -e.getValue()
Map sortedMap = unsortedMap.entrySet().stream() .sorted(Comparator.comparingInt(e -> -e.getValue())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> < throw new AssertionError(); >, LinkedHashMap::new )); sortedMap.entrySet().forEach(System.out::println);
Maria=34 Mark=31 Sydney=24 John=21
Это дополнительное преимущество использования этого подхода вместо Map.Entry.comparingByValue() или Map.Entry::getValue . Вы можете легко переключаться между порядком убывания и возрастания.
Заключение
В этом руководстве мы рассмотрели, как отсортировать Java HashMap по значению . Мы использовали Java 8 Streams с LinkedHashMap для достижения этой функциональности, как для сортировки по возрастанию, так и по убыванию значений.
Licensed under CC BY-NC-SA 4.0
Как отсортировать HashMap по значению?
Дано предложение, я его разбиваю по пробелу, в один массив записываю слова, в других количество попаданий введнного символа в слове.
Получается два массива, я их соединяю в хеш-таблицу, получается (слово => кол-во введенного символа)
Как её осортировать по значению?
- Вопрос задан более трёх лет назад
- 4054 просмотра
Комментировать
Решения вопроса 2
Сергей Горностаев @sergey-gornostaev Куратор тега Java
Седой и строгий
Вы можете добиться определённого порядка вывода элементов HashMap
words_counters.entrySet() .stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .forEach(System.out::println);
Но не отсортировать саму коллекцию, так как HashMap не гарантирует сохранения упорядоченности элементов.
Если нужна упорядоченная реализация Map используйте TreeMap или LinkedHashMap.
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Sergey Shvyrev @CellycoMobiles
indi developer @CellycoMobiles
Простите с телефона. Но думаю ответ в области Streams.
Например :
map.entryset().stream() .sorted((entry1, entry2) -> customComparator.max(entry1.value, entry2.value)) .map(entry -> entry.getKey()) .collect(toList())
Сортировка Java HashMap
В этом кратком руководстве мы узнаем, как сортировать HashMap в Java .
В частности, мы рассмотрим сортировку записей HashMap по их ключу или значению, используя:
- ДеревоКарта
- ArrayList и Collections.sort()
- Набор деревьев
- Использование потокового API
- Использование библиотеки гуавы
2. Использование древовидной карты
Как мы знаем, ключи в TreeMap сортируются в их естественном порядке . Это хорошее решение, когда мы хотим отсортировать пары ключ-значение по их ключу. Итак, идея состоит в том, чтобы передать все данные из нашего HashMap в TreeMap .
Для начала давайте определим HashMap и инициализируем его некоторыми данными:
MapString, Employee> map = new HashMap>(); Employee employee1 = new Employee(1L, "Mher"); map.put(employee1.getName(), employee1); Employee employee2 = new Employee(22L, "Annie"); map.put(employee2.getName(), employee2); Employee employee3 = new Employee(8L, "John"); map.put(employee3.getName(), employee3); Employee employee4 = new Employee(2L, "George"); map.put(employee4.getName(), employee4);
Обратите внимание, что для класса Employee мы реализовали Comparable :
public class Employee implements ComparableEmployee> private Long id; private String name; // constructor, getters, setters // override equals and hashCode @Override public int compareTo(Employee employee) return (int)(this.id - employee.getId()); > >
Затем мы сохраняем записи в TreeMap , используя его конструктор:
TreeMapString, Employee> sorted = new TreeMap>(map);
Мы также можем использовать метод putAll для копирования данных:
TreeMapString, Employee> sorted = new TreeMap>(); sorted.putAll(map);
Вот и все! Чтобы убедиться, что наши записи карты отсортированы по ключу, давайте распечатаем их:
Annie=Employee George=Employee John=Employee Mher=Employee
Как видим, ключи отсортированы в естественном порядке.
3. Использование ArrayList
Конечно, мы можем сортировать записи карты с помощью ArrayList . Ключевое отличие от предыдущего метода заключается в том, что здесь мы не поддерживаем интерфейс карты .
3.1. Сортировать по ключу
Давайте загрузим набор ключей в ArrayList :
ListString> employeeByKey = new ArrayList>(map.keySet()); Collections.sort(employeeByKey);