Java linkedhashmap сортировка по значению

Java – How to sort LinkedHashMap by its Values ?

1. Sorting LinkedHashMap in ascending order of values :

1.1 Ascending-order sorting steps :-

  1. get entrySet() from Map
  2. create/convert entry set into List of entries
  3. sort converted List using Collections class’ sort(); method by implementing Comparator for natural-ordering by its Values
  4. clear original LinkedHashMap using clear(); method
  5. Iterate List and add entries to original LinkedHashMap, after clearing
  6. finally print Map.Entry in console

1.2 Sorting LinkedHashMap by its values in ascending-order :

  • LinkedHashMap maintains insertion-order of keys
  • In below illustration, we will sort/convert LinkedHashMap into natural-ordering of values i.e.; ascending-order of values

SortingLinkedHashMapInAscOrderByValues.java

package in.bench.resources.collection; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class SortingLinkedHashMapInAscOrderByValues < public static void main(String[] args) < // create LinkedHashMap object of type Map linkMap = new LinkedHashMap(); // adding key-value pairs to LinkedHashMap object linkMap.put("Google", "Sundar Pichai"); linkMap.put("Facebook", "Mark Zuckerberg"); linkMap.put("LinkedIn", "Reid Hoffman"); linkMap.put("Apple Inc", "Tim Cook"); linkMap.put("Microsoft", "Bill Gates"); linkMap.put("Amazon", "Jeff Bezos"); linkMap.put("Oracle", "Larry Ellison"); System.out.println("Before Sorting by Values -" + " as per insertion-order : \n"); // iterate original LinkedHashMap for(Map.Entry lhmap : linkMap.entrySet()) < System.out.println("Key : " + lhmap.getKey() + "\t\t" + "Value : " + lhmap.getValue()); >// 1. get entrySet from LinkedHashMap object Set companyFounderSet = linkMap.entrySet(); // 2. convert LinkedHashMap to List of Map.Entry List companyFounderListEntry = new ArrayList( companyFounderSet); // 3. sort list of entries using Collections class' // utility method sort(ls, cmptr) Collections.sort(companyFounderListEntry, new Comparator() < @Override public int compare(Entryes1, Entry es2) < return es1.getValue().compareTo(es2.getValue()); >>); // 4. clear original LinkedHashMap linkMap.clear(); // 5. iterating list and storing in LinkedHahsMap for(Map.Entry map : companyFounderListEntry) < linkMap.put(map.getKey(), map.getValue()); >System.out.println("\n\nSorted LinkedHashMap by its Values" + " in ascending-order\n"); // 6. iterate LinkedHashMap to retrieved stored values for(Map.Entry lhmap : linkMap.entrySet()) < System.out.println("Key : " + lhmap.getKey() + "\t\t" + "Value : " + lhmap.getValue()); >> >
Before Sorting by Values - as per insertion-order : Key : Google Value : Sundar Pichai Key : Facebook Value : Mark Zuckerberg Key : LinkedIn Value : Reid Hoffman Key : Apple Inc Value : Tim Cook Key : Microsoft Value : Bill Gates Key : Amazon Value : Jeff Bezos Key : Oracle Value : Larry Ellison Sorted LinkedHashMap by its Values in ascending-order Key : Microsoft Value : Bill Gates Key : Amazon Value : Jeff Bezos Key : Oracle Value : Larry Ellison Key : Facebook Value : Mark Zuckerberg Key : LinkedIn Value : Reid Hoffman Key : Google Value : Sundar Pichai Key : Apple Inc Value : Tim Cook

2. Sorting LinkedHashMap in descending order of Values :

2.1 Descending-order sorting steps :-

  1. get entrySet() from Map
  2. create/convert entry set into List of entries
  3. sort converted List using Collections class’ sort(); method by implementing Comparator for reverse sorting logic by its Values
  4. clear original LinkedHashMap using clear(); method
  5. Iterate List and add entries to original LinkedHashMap, after clearing
  6. finally print Map.Entry in console

2.2 Sorting LinkedHashMap by its values in descending-order :

  • LinkedHashMap maintains insertion-order of keys
  • In below illustration, we will sort/convert LinkedHashMap into reverse-ordering of Values i.e.; descending-order of values

SortingLinkedHashMapInDesOrderByValues.java

package in.bench.resources.collection; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; public class SortingLinkedHashMapInDesOrderByValues < public static void main(String[] args) < // creating LinkedHashMap object of type Map linkMap = new LinkedHashMap(); // adding key-value pairs to LinkedHashMap object linkMap.put("Google", "Sundar Pichai"); linkMap.put("Facebook", "Mark Zuckerberg"); linkMap.put("LinkedIn", "Reid Hoffman"); linkMap.put("Apple Inc", "Tim Cook"); linkMap.put("Microsoft", "Bill Gates"); linkMap.put("Amazon", "Jeff Bezos"); linkMap.put("Oracle", "Larry Ellison"); System.out.println("Before Sorting by Values -" + " as per insertion-order : \n"); // iterate original LinkedHashMap for(Map.Entry lhmap : linkMap.entrySet()) < System.out.println("Key : " + lhmap.getKey() + "\t\t" + "Value : " + lhmap.getValue()); >// 1. get entrySet from LinkedHashMap object Set companyFounderSet = linkMap.entrySet(); // 2. convert LinkedHashMap to List of Map.Entry List companyFounderListEntry = new ArrayList( companyFounderSet); // 3. sort list of entries using Collections class' // utility method sort(ls, cmptr) Collections.sort(companyFounderListEntry, new Comparator() < @Override public int compare(Entryes1, Entry es2) < return es2.getValue().compareTo(es1.getValue()); >>); // 4. clear original LinkedHashMap linkMap.clear(); // 5. iterating list and storing in LinkedHahsMap for(Map.Entry map : companyFounderListEntry) < linkMap.put(map.getKey(), map.getValue()); >System.out.println("\n\nSorted LinkedHashMap by its Values" + " in descending-order\n"); // 6. iterate LinkedHashMap to retrieved stored values for(Map.Entry lhmap : linkMap.entrySet()) < System.out.println("Key : " + lhmap.getKey() + "\t\t" + "Value : " + lhmap.getValue()); >> >
Before Sorting by Values - as per insertion-order : Key : Google Value : Sundar Pichai Key : Facebook Value : Mark Zuckerberg Key : LinkedIn Value : Reid Hoffman Key : Apple Inc Value : Tim Cook Key : Microsoft Value : Bill Gates Key : Amazon Value : Jeff Bezos Key : Oracle Value : Larry Ellison Sorted LinkedHashMap by its Values in descending-order Key : Apple Inc Value : Tim Cook Key : Google Value : Sundar Pichai Key : LinkedIn Value : Reid Hoffman Key : Facebook Value : Mark Zuckerberg Key : Oracle Value : Larry Ellison Key : Amazon Value : Jeff Bezos Key : Microsoft Value : Bill Gates

Important points to remember about Map :

Happy Coding !!
Happy Learning !!

Источник

Как отсортировать хэш-карту по значению в Java

В этом уроке мы рассмотрим, как сортировать хэш-карту по значению в Java. Мы будем использовать потоки Java 8 и класс LinkedHashMap для сортировки в порядке возрастания и убывания.

В этом уроке мы рассмотрим как сортировать хэш-карту по значению в Java .

Давайте продолжим и создадим простую Хэш-карту :

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

У нас есть Строка s в качестве ключей и Целое число s в качестве значений. И мы хотели бы отсортировать эту карту на основе значений.

HashMap s не гарантирует сохранение порядка его элементов в любом случае. Порядок может меняться со временем, и наиболее определенно не будет напечатан обратно в порядке вставки:

John=21 Mark=31 Maria=34 Sydney=24

Если вы повторно запустите эту программу, она сохранит этот порядок, так как HashMap упорядочивает свои элементы в ячейки на основе хэш-значения ключей. При печати значений из HashMap его содержимое печатается последовательно , поэтому результаты останутся прежними, если мы повторно запустим программу несколько раз.

Примечание: |/Карта деревьев расширяет интерфейс SortedMap , в отличие от реализации HashMap . Древовидная карта s означает быть отсортированным аналогом, однако Древовидная карта s только сортируется по ключам , учитывая компаратор.

Сортировка хэш-карты по значению с помощью LinkedHashMap

LinkedHashMap сохраняет порядок вставки. Он содержит двусвязный список всех записей, что позволяет вам очень естественно получать доступ к его элементам и перебирать их.

Итак, самый простой способ преобразовать несортированную Хэш-карту в связанную хэш-карту – это добавить элементы в том порядке, в котором мы хотели бы их видеть.

Сортировка хэш-карты в порядке возрастания

Чтобы отсортировать несортированную карту , которую мы видели ранее, мы создадим новую Связанную карту для размещения элементов в том порядке, в котором мы хотим, чтобы они находились.

Давайте начнем с сортировки Хэш-карты в порядке возрастания:

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

То, что мы здесь сделали, – это потоковое | Несортированное изображение набор объектов Map.Entry . Затем, используя метод sorted () , мы можем использовать различные Компараторы , чтобы указать, как сравниваются записи.

Поскольку мы имеем дело с простыми целыми числами, мы можем легко использовать метод Comparator.comparingInt() и передать Лямбда-выражение . С помощью этого выражения мы задаем сортировку ключ из типа T (в нашем случае Целое число ).Затем этот метод возвращает Компаратор , который сравнивает этот ключ сортировки.

Как только они отсортированы, мы можем собрать() их в новую карту с помощью вызова Collectors.toMap () , где мы используем те же Map.Entry::getKey и Map.Entry::GetValue , как в Несортированной карте .

Наконец, создается новый 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() для сравнения записей в любом случае.

Сортировка хэш-карты в порядке Убывания

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Теперь давайте вместо этого отсортируем несортированную хэш-карту в порядке убывания . Единственное различие, которое вам нужно сделать, – это Лямбда-выражение, которое мы предоставили методу 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 по значению . Мы использовали потоки Java 8 с классом LinkedHashMap для достижения этой функциональности, как для сортировки по возрастанию, так и по убыванию значений.

Читайте ещё по теме:

Источник

Читайте также:  Java jdbc exception rollback
Оцените статью