- Java – How to sort LinkedHashMap by its Values ?
- 1. Sorting LinkedHashMap in ascending order of values :
- 1.1 Ascending-order sorting steps :-
- 1.2 Sorting LinkedHashMap by its values in ascending-order :
- SortingLinkedHashMapInAscOrderByValues.java
- 2. Sorting LinkedHashMap in descending order of Values :
- 2.1 Descending-order sorting steps :-
- 2.2 Sorting LinkedHashMap by its values in descending-order :
- SortingLinkedHashMapInDesOrderByValues.java
- Important points to remember about Map :
- Как отсортировать хэш-карту по значению в Java
- Сортировка хэш-карты по значению с помощью LinkedHashMap
- Сортировка хэш-карты в порядке возрастания
- Сортировка хэш-карты в порядке Убывания
- Git Essentials
- Вывод
- Читайте ещё по теме:
Java – How to sort LinkedHashMap by its Values ?
1. Sorting LinkedHashMap in ascending order of values :
1.1 Ascending-order sorting steps :-
- get entrySet() from Map
- create/convert entry set into List of entries
- sort converted List using Collections class’ sort(); method by implementing Comparator for natural-ordering by its Values
- clear original LinkedHashMap using clear(); method
- Iterate List and add entries to original LinkedHashMap, after clearing
- 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 SetcompanyFounderSet = 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 :-
- get entrySet() from Map
- create/convert entry set into List of entries
- sort converted List using Collections class’ sort(); method by implementing Comparator for reverse sorting logic by its Values
- clear original LinkedHashMap using clear(); method
- Iterate List and add entries to original LinkedHashMap, after clearing
- 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 SetcompanyFounderSet = 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 .
Давайте продолжим и создадим простую Хэш-карту :
MapunsortedMap = 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 сохраняет порядок вставки. Он содержит двусвязный список всех записей, что позволяет вам очень естественно получать доступ к его элементам и перебирать их.
Итак, самый простой способ преобразовать несортированную Хэш-карту в связанную хэш-карту – это добавить элементы в том порядке, в котором мы хотели бы их видеть.
Сортировка хэш-карты в порядке возрастания
Чтобы отсортировать несортированную карту , которую мы видели ранее, мы создадим новую Связанную карту для размещения элементов в том порядке, в котором мы хотим, чтобы они находились.
Давайте начнем с сортировки Хэш-карты в порядке возрастания:
MapsortedMap = 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() :
MapsortedMap = 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 :
MapsortedMap = 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() :
MapsortedMap = 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 для достижения этой функциональности, как для сортировки по возрастанию, так и по убыванию значений.