Вступление:
В этом уроке мы научимся сортировать 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); //OrList<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, являются их собственными. |