Статьи

Сортировка HashMap в Java

Вступление:

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