Сортировка 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 и печатаем его ключ и значение.