Как отсортировать hashmap по значению java
Перейти к содержимому

Как отсортировать hashmap по значению java

  • автор:

Как отсортировать 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 Комментировать

CellycoMobiles

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); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *