Как отсортировать Map по ключу
Короткий ответ
TreeMap всегда хранит ключи отсортированными. Скопируйте в него любую Map:
void main() {
Map<String, Integer> stock = Map.of("pears", 4, "apples", 10, "cherries", 7);
IO.println(new TreeMap<>(stock));
}Результат:
{apples=10, cherries=7, pears=4}Обратный порядок
Передайте компаратор в конструктор TreeMap:
void main() {
var stock = new TreeMap<String, Integer>(Comparator.reverseOrder());
stock.putAll(Map.of("pears", 4, "apples", 10, "cherries", 7));
IO.println(stock);
}Результат:
{pears=4, cherries=7, apples=10}Первый и последний ключ
TreeMap умеет быстро находить крайние и ближайшие ключи:
void main() {
var rates = new TreeMap<>(Map.of(0, "free", 100, "basic", 500, "pro"));
IO.println(rates.firstKey());
IO.println(rates.floorEntry(250).getValue());
}Результат:
0
basicЧерез поток
Если TreeMap не нужна, отсортируйте пары в потоке:
void main() {
Map<String, Integer> stock = Map.of("pears", 4, "apples", 10, "cherries", 7);
stock.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(e -> IO.println(e.getKey() + " " + e.getValue()));
}Результат:
apples 10
cherries 7
pears 4Частая ошибка
Сортировать числа, записанные строками. Строки сравниваются посимвольно, поэтому "10" идёт раньше "9":
void main() {
IO.println(new TreeMap<>(Map.of("9", "nine", "10", "ten", "100", "hundred")).keySet());
}Результат:
[10, 100, 9]Храните числовые ключи как Integer.
Функции из этого ответа
- TreeMap — Словарь, ключи которого всегда отсортированы.
- Map.Entry — Одна пара «ключ — значение» словаря.
- Collectors.toMap() — Сборщик, который строит словарь из элементов потока.