Map сортировка по значениям java

Sort HashMap by Value or Key in Java

Learn How to sort a Map in Java using plain Java, Java Streams API, and Guava Library.

Overview

Java HashMap is an unsorted and unordered collection. However, it is one of Java’s most popular and most used collections. In this tutorial, we’ll focus on the ways to sort HashMap elements by the value or by the key.

We’ll first prepare a HashMap of custom objects as values and then explore the ways to sort it using TreeMap, Java Streams, TreeSet, or ArrayList.

Prepare a HashMap

We will first create a HashMap and use it throughout the tutorial. Our map stores Product Ids as keys and Product objects as values.

Map map;Code language: Java (java)

To sort the Map based on the value (Product), we will need our Product to implement the Comparable interface. Thus, our Product class looks like this.

public class Product implements ComparableProduct> < private Long id; private String name; public int compareTo(Product product) < return this.name.compareTo(product.name); > // Constructors, Getters and Setters >Code language: Java (java)

Now, let’s create a few Product instances and put them on our Map.

Product product1 = new Product(2L, "Television"); Product product2 = new Product(4L, "Grinder"); Product product3 = new Product(3L, "Headphone"); Product product4 = new Product(5L, "Monitor"); map = new HashMap<>(); map.put(product1.getId(), product1); map.put(product2.getId(), product2); map.put(product3.getId(), product3); map.put(product4.getId(), product4);Code language: Java (java)

Sorting a HashMap by Key

This section will cover different ways of sorting a HashMap using its key.

Sort Map with TreeMap

Java TreeMap implements the Map interface and stores elements sorted by their keys. We can use TreeMap to sort a Java HashMap instance.

Map treeMap = new TreeMap<>(map); treeMap.entrySet().forEach(System.out::println); //prints: //2=Product(id=2, name=Television) //3=Product(id=3, name=Headphone) //4=Product(id=4, name=Grinder) //5=Product(id=5, name=Monitor)Code language: Java (java)

The TreeMap constructor creates a new TreeMap instance containing all the entries from the given Map.

Using Java Streams sorted() Method

The sorted() method, an intermediate operation of the Java Stream, returns a new Stream containing all the Stream elements sorted by the given Comparator. We can use Java Stream’s sorted() method to sort a HashMap.

map.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .forEach(System.out::println); //prints: //2=Product(id=2, name=Television) //3=Product(id=3, name=Headphone) //4=Product(id=4, name=Grinder) //5=Product(id=5, name=Monitor)Code language: Java (java)

Please take note of the argument to the sorted() method. The Entry class provides a Comparator to sort a HashMap using the key.

Читайте также:  Java mockito when any

Using a TreeSet

Java TreeSet is an implementation of Set that stores sorted elements. We can use a TreeSet instance to sort Java HashMap keys.

Set keys = new TreeSet<>(map.keySet()); System.out.println(keys); //prints: //[2, 3, 4, 5]Code language: Java (java)

Using an ArrayList

Alternatively, the sort() method of Java Collections class sorts all the elements in a List. We can use an ArrayList to sort Java HashMap keys.

List keys = new ArrayList<>(map.keySet()); Collections.sort(keys); System.out.println(keys); //prints: //[2, 3, 4, 5]Code language: Java (java)

The ArrayList constructor creates a new ArrayList instance containing all the elements from the given collection. In this example, we used a Set of our HashMap keys.

Sorting a HashMap by Value

So far, we have sorted our HashMap based on the keys. Now, we will look at different ways to sort HashMap by values. The value type of our Map is a custom object. To perform the sorting based on the value, we must provide a Comparator, or the custom object must be Comparable.
Our Product implements Comparable and compares based on the Product’s name.

Using Java Streams sorted() Method

This time we will use the Java Streams sorted() method to sort a HashMap by values.

map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .forEach(System.out::println); //prints: //4=Product(id=4, name=Grinder) //3=Product(id=3, name=Headphone) //5=Product(id=5, name=Monitor) //2=Product(id=2, name=Television)Code language: Java (java)

Please note that we used the Map.Entry.comparingByValue() Comparator that sorts a Map based on the values.

Using TreeSet

Like using the TreeSet constructor for sorting Map keys, we can use the TreeSet constructor to sort HashMap by values.

Set values = new TreeSet<>(map.values()); values.forEach(System.out::println); //prints: //Product(id=4, name=Grinder) //Product(id=3, name=Headphone) //Product(id=5, name=Monitor) //Product(id=2, name=Television)Code language: Java (java)

Using ArrayList

To use an ArrayList to sort Java HashMap values, we need to prepare an ArrayList containing all the Map values and then use the sort() method of the Collections class.

List products = new ArrayList<>(map.values()); Collections.sort(products); products.forEach(System.out::println); //prints: //Product(id=4, name=Grinder) //Product(id=3, name=Headphone) //Product(id=5, name=Monitor) //Product(id=2, name=Television)Code language: Java (java)

Summary

The article demonstrated several ways of Sorting a Java HashMap by keys or values.

Читайте также:  Php настройка поддержки mysql

We also understood that we need to provide their sorting strategy when we have custom objects as keys or as values. This is done by either providing a Comparator implementation, or the custom object must implement Comparable. This tutorial used TreeMap, Java Streams API, TreeSet, and ArrayList to sort the map keys and values.

For the complete source code of the examples used here, please visit our GitHub Repository.

Источник

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 не гарантирует поддержание порядка

В этом руководстве мы рассмотрим, как отсортировать 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 — это добавить элементы в том порядке, в котором мы хотели бы, чтобы они располагались.

Читайте также:  Python pandas sort by value

Сортировка 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

Источник

Оцените статью