Сортировка Map по значениям в Java — LinkedHashMap и Stream

Чтобы понять этот пример, нужно знать следующие темы:

  • Интерфейс Map в Java

  • LinkedHashMap в Java

Пример: Сортировка map по значениям

import java.util.*;
import java.util.Map.Entry;

class Main {

  public static void main(String[] args) {

    // создаём map и кладём в неё элементы
    LinkedHashMap<String, String> capitals = new LinkedHashMap();
    capitals.put("Nepal", "Kathmandu");
    capitals.put("India", "New Delhi");
    capitals.put("United States", "Washington");
    capitals.put("England", "London");
    capitals.put("Australia", "Canberra");

    // вызываем метод sortMap() для сортировки map
    Map<String, String> result = sortMap(capitals);

    for (Map.Entry entry : result.entrySet()) {
      System.out.print("Key: " + entry.getKey());
      System.out.println(" Value: " + entry.getValue());
    }
  }

  public static LinkedHashMap sortMap(LinkedHashMap map) {
    List <Entry<String, String>> capitalList = new LinkedList<>(map.entrySet());

    // вызываем метод sort() класса Collections
    Collections.sort(capitalList, (l1, l2) -> l1.getValue().compareTo(l2.getValue()));

    // создаём новую map
    LinkedHashMap<String, String> result = new LinkedHashMap();

    // переносим записи из списка в map
    for (Map.Entry<String, String> entry : capitalList) {
      result.put(entry.getKey(), entry.getValue());
    }

    return result;
  }
}

Вывод:

Key: Australia Value: Canberra
Key: Nepal Value: Kathmandu
Key: England Value: London
Key: India Value: New Delhi
Key: United States Value: Washington

В программе выше мы создали LinkedHashMap с именем capitals. Map хранит страны и их соответствующие столицы.

Здесь мы создали метод sortMap(), который принимает map и возвращает отсортированную map.

Внутри метода мы сначала создали список с именем capitalList из map capitals. Затем мы используем метод sort() класса Collections, чтобы отсортировать элементы списка.

Метод sort() принимает два параметра: список для сортировки и компаратор. В нашем случае компаратор — это лямбда-выражение.

(l1, l2) -> l1.getValue().compareTo(l2.getValue())

Здесь лямбда-выражение принимает два соседних элемента (l1 и l2) списка. Затем оно использует метод getValue(), чтобы получить значение, и метод compareTo(), чтобы сравнить два значения.

После операции мы получаем отсортированный список capitalList. Затем мы просто преобразуем список в LinkedHashMap с именем result и возвращаем её.

Вернувшись в метод main(), мы проходим по каждому элементу map и печатаем его ключ и значение.