Вступление:
В этом уроке мы научимся сортировать Java HashMap . Мы можем отсортировать HashMap либо по ключам, либо по значениям. Мы обсудим обе эти стратегии.
Сортировка Java HashMap :
Чтобы следовать за остальной частью статьи, давайте сначала создадим HashMap:
1
2
3
4
5
6
7
|
HashMap<Integer, Student> map = new HashMap<>(); map.put( 1003 , new Student( 1003 , "Sam" )); map.put( 1005 , new Student( 1005 , "Joseph" )); map.put( 1001 , new Student( 1001 , "Kate" )); map.put( 1002 , new Student( 1002 , "Miranda" )); map.put( 1004 , new Student( 1004 , "Peter" )); |
где Student — это POJO с полями id и name :
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
class Student { private Integer id; private String name; Student(Integer id, String name) { this .id = id; this .name = name; } public String toString() { return "[id=" +id + ", name=" + name + "]" ; } } |
Теперь давайте рассмотрим различные подходы, которые мы можем использовать для сортировки HashMap:
1. Использование TreeMap :
Как мы знаем, TreeMap — это отсортированная карта, где по умолчанию элементы сортируются по естественному упорядочению их ключей. Итак, основной подход заключается в том, чтобы поместить все элементы из HashMap в TreeMap:
1
2
3
4
5
6
|
TreeMap<Integer, Student> sortedMap = new TreeMap<>(map); //Or else TreeMap<Integer, Student> sortedMap = new TreeMap<>(); sortedMap.putAll(map); |
Обратите внимание, что мы можем либо передать исходный HashMap в конструктор, либо использовать метод putAll () . Таким образом, наша sortedMap будет хранить элементы в отсортированном порядке значений ключей:
1
2
3
|
{ 1001 =[id= 1001 , name=Kate], 1002 =[id= 1002 , name=Miranda] , 1003 =[id= 1003 , name=Sam], 1004 =[id= 1004 , name=Peter] , 1005 =[id= 1005 , name=Joseph]} |
2. С ArrayList:
Если нам просто нужны отсортированные ключи или значения и нас не волнует карта , мы можем использовать ArrayList.
Здесь мы сначала извлечем ключи или значения в ArrayList, а затем отсортируем этот список с помощью Collections.sort () :
1
2
3
4
5
6
|
List<Integer> mapKeys = new ArrayList<>(map.keySet()); Collections.sort(mapKeys); //Or List<Student> mapValues = new ArrayList<>(map.values()); Collections.sort(mapValues); |
Здесь сортировка Карты по значениям будет работать только тогда, когда наш Студент реализует Comparable:
1
2
3
4
5
6
7
8
|
public class Student implements Comparable<Student> { ... public int compareTo(Student other) { return this .id.compareTo(other.id); } } |
Это так, поскольку значения на нашей карте представляют собой объект пользовательского типа — Student .
3. С TreeSet:
Если мы также намереваемся избежать дубликатов в результирующем списке ключей или значений, мы можем выбрать TreeSet:
1
|
SortedSet<String> mapKeys = new TreeSet<>(map.keySet()); |
Точно так же мы можем создать отсортированный набор значений карты. Однако нам придется переопределить метод equals () и hashCode (), чтобы это работало для пользовательских объектов.
4. Java 8 Streams:
Начиная с Java 8, мы можем использовать Stream API для сортировки нашей карты. Чтобы отсортировать карту Java с помощью ключей, у нас будет:
1
2
3
4
5
6
7
8
|
Map<Integer, Student> sortedMap = map.entrySet() .stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors .toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap:: new )); |
Здесь мы собрали отсортированную карту в LinkedHashMap, чтобы сохранить отсортированный порядок .
Аналогично, для сортировки по карте по значениям мы будем использовать comparingByValue () :
1
2
3
4
5
6
7
8
|
sortedMap = map.entrySet() .stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors .toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap:: new )); |
Как обычно, при работе с пользовательскими объектами этот объект должен реализовывать интерфейс Comparable .
У нас есть подробная статья о Java 8 Collectors , которая поможет вам понять использование метода Collectors.toMap () .
Чтобы отсортировать карту в порядке убывания, мы можем просто использовать Collections.reverseOrder ():
1
2
3
4
5
6
7
8
|
sortedMapDesc = map.entrySet() .stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByKey())) .collect(Collectors .toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap:: new )); |
Давайте распечатаем sortedMapDesc на консоли:
1
2
3
|
{ 1005 =[id= 1005 , name=Joseph], 1004 =[id= 1004 , name=Peter], 1003 =[id= 1003 , name=Sam], 1002 =[id= 1002 , name=Miranda], 1001 =[id= 1001 , name=Kate]} |
Как мы видим, карта теперь сортируется в порядке убывания по ключам.
Вывод:
В этой статье мы рассмотрели различные подходы для сортировки Java HashMap — используя TreeMap, ArrayList или TreeSet . Мы также рассмотрели метод sorted () Java 8 Stream API, который может помочь нам отсортировать нашу карту по ключам или значениям.
Оставьте первый комментарий.
Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Сортировка HashMap в Java Мнения, высказанные участниками Java Code Geeks, являются их собственными. |