Как сортировать Map
В данной статье мы рассмотрим способы сортировки структуры данных Map в Java по ключу (key) и по значению (value).
Сортировка по значению:
import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; public class SortMapByValue < public static void main(String[] args) < MapinitialMap = new HashMap<>(); initialMap.put("D", 10); initialMap.put("I", 5); initialMap.put("H", 6); initialMap.put("C", 20); initialMap.put("K", 1); initialMap.put("G", 7); initialMap.put("F", 8); initialMap.put("A", 99); initialMap.put("B", 50); initialMap.put("J", 2); initialMap.put("E", 9); System.out.println("initialMap: " + initialMap); Map sortedMap = sortMapByValue(initialMap); System.out.println("sortedMap: " + sortedMap); > private static > Map sortMapByValue(Map initialMap) < List> list = new LinkedList<>(initialMap.entrySet()); list.sort(Comparator.comparing(o -> (o.getValue()))); Map result = new LinkedHashMap<>(); for (Map.Entry entry : list) < result.put(entry.getKey(), entry.getValue()); >return result; > >
Вывод в консоль:
initialMap: sortedMap:
В данном примере основные шаги в методе sortMapByValue это:
- Преобразование Map в список Map.
- Сортировка полученного списка с использованием нашего компаратора (сравнение значений)
- Проходимся циклом по списку и кладём элементы в новую Map.
Cортировка по ключу
import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class SortMapByKey < public static void main(String[] args) < MapinitialMap = new HashMap<>(); initialMap.put(100, "Hundred"); initialMap.put(90, "Ninety"); initialMap.put(80, "Eighty"); initialMap.put(70, "Seventy"); initialMap.put(60, "Sixty"); initialMap.put(50, "Fifty"); initialMap.put(40, "Forty"); initialMap.put(30, "Thirty"); initialMap.put(20, "Twenty"); initialMap.put(10, "Ten"); initialMap.put(2, "Two"); initialMap.put(1, "One"); System.out.println("initialMap: " + initialMap); Map sortedMap = new TreeMap<>(initialMap); System.out.println("sortedMap" + sortedMap); > >
initialMap: sortedMap
В данном случае, решение заключается в использовании устройства коллекции TreeMap, которая гарантирует, что элементы внутри будут отсортированы. Также, мы можем передать свой компаратор в эту коллекцию, для изменения логику сортировки.
На этом мы заканчиваем обзор сортировки Map в Java.
Полезности
Туториалы
Системный дизайн
Собеседования
Студенты
Задачи
Немного о себе
Приветствую! Меня зовут Евгений. На этом сайте я пишу о разработке программного обеспечения. Связаться со мной вы можете по email: proselytear@yahoo.com Имеет смысл, предварительно ознакомиться вот с этим FAQ разделом.
Недавние публикации
- Механизмы CAS и FAA глазами Java разработчика
- ExecutorService в Java и примеры его применения.
- Особенности работы PreparedStatement в JDBC
- Основы кэширования в Hibernate
- Феномены чтения глазами разработчика
Copyright © 2023 PROSELYTE.
Omega WordPress Theme by ThemeHall
Как отсортировать map по значению java
Отсортировать мап по значению можно преобразовав ее в LinkedHashMap или TreeMap :
import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; import java.util.stream.Collectors; public class App public static void main(String[] args) MapString, Integer> myMap = Map.of("Ivan", 2000, "Petr", 1990, "Egor", 1995); MapString, Integer> sortedMap1 = myMap.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new )); System.out.println(sortedMap1); // => MapString, Integer> sortedMap2 = new TreeMapString, Integer>( Comparator.comparing(myMap::get)); sortedMap2.putAll(myMap); System.out.println(sortedMap2); // => > >
Сортировка ключей в HashMap
Используйте реализацию TreeMap, в данном случае Java сама будет отсортировывать данные по ключу.
Map treeMap = new TreeMap(yourHashMap);
UPD Сортировка будет проходить согласно методу compareTo класса, которым является ключ
Отслеживать
ответ дан 9 июн 2016 в 13:09
1,929 10 10 серебряных знаков 19 19 бронзовых знаков
Мне надо отсортировать результат по возрастанию кода ASCII, она же так и отсортирует, если массив у меня Character ?
9 июн 2016 в 13:17
@faoxis, то есть в качестве ключа используется класс Character?
9 июн 2016 в 13:20
Да, вот: HashMap
9 июн 2016 в 13:22
Можно взять keySet() для Вашего Map’а. И отсортировать его. Если прям надо получить отсортированный вывод по ключу. И далее вывод по отсортированному Set’у в цикле.
9 июн 2016 в 13:23
А можно пример ?
10 июн 2016 в 4:43
- java
- java-hashmap
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Сортировка карты по ключам в Java
В этом посте будут обсуждаться различные методы сортировки карты в Java в соответствии с естественным порядком ее ключей.
1. Использование TreeMap
TreeMap представляет собой реализацию на основе красно-черного дерева Map , который отсортирован в соответствии с естественным порядком его ключей. Мы можем передать несортированную карту в TreeMap конструктор, который затем создаст новую карту дерева, содержащую те же отображения, что и данная карта, но упорядоченные в соответствии с естественным порядком ее ключей.
import java . util . HashMap ;
import java . util . Map ;
import java . util . TreeMap ;
class Main
// Общий метод для сортировки карты по ключам с помощью `TreeMap`
public static < K , V >Map < K , V >sortByKeys ( Map < K , V >unsortedMap )
// создать `TreeMap` из заданной карты и вернуть ее
return new TreeMap <> ( unsortedMap ) ;
public static void main ( String [ ] args )
Map < String , String >country = new HashMap <> ( ) ;
country . put ( «India» , «New Delhi» ) ;
country . put ( «USA» , «Washington D.C.» ) ;
country . put ( «Japan» , «Tokyo» ) ;
country . put ( «China» , «Beijing» ) ;
country = sortByKeys ( country ) ;
System . out . println ( «Sorted map by keys :\n» + country ) ;
результат:
Sorted map by keys :
Использование Guava TreeMap :
Библиотека Google Guava также предоставляет TreeMap реализацию, которую мы можем использовать для создания изменяемого пустого TreeMap экземпляр, который сортируется в соответствии с Компаратором, предоставленным во время создания карты. Мы можем пройти мимо Guava Ordering.natural() для естественного порядка ключей.
// Общий метод для сортировки карты по ключам в Java с использованием Guava
public static < K , V >TreeMap < K , V >sortByKeys ( Map < K , V >unsortedMap ) <
TreeMap < K , V >treeMap = Maps . newTreeMap ( ( Comparator
treeMap . putAll ( unsortedMap ) ;
return treeMap ;
2. Использование LinkedHashMap
LinkedHashMap представляет собой хэш-таблицу и реализацию связанного списка Map интерфейс с предсказуемым порядком итерации, который представляет собой порядок, в котором ключи были вставлены в карту. Мы можем использовать это свойство для создания копии карты, отсортированной в соответствии с естественным порядком ее ключей.
Идея состоит в том, чтобы создать список ключей, присутствующих на карте, и отсортировать его. Затем мы вставляем пару ключ-значение в пустой LinkedHashMap для каждого ключа в отсортированном списке. Ключи будут сортировать результат LinkedHashMap .
import java . util . * ;
class Main
// Общий метод для сортировки карты по ключам с использованием `LinkedHashMap`
public static < K extends Comparable , V >Map < K , V >sortByKeys ( Map < K , V >map )
// создаем список ключей карты и сортируем его
List
Collections . sort ( keys ) ;
// создаем пустой `LinkedHashMap` с порядком вставки`
Map < K , V >linkedHashMap = new LinkedHashMap <> ( ) ;
// для каждого ключа в отсортированном списке вставляем ключ-значение
// пара в `LinkedHashMap`
for ( K key : keys ) <
linkedHashMap . put ( key , map . get ( key ) ) ;
return linkedHashMap ;
public static void main ( String [ ] args )
Map < String , String >country = new HashMap <> ( ) ;
country . put ( «India» , «New Delhi» ) ;
country . put ( «USA» , «Washington D.C.» ) ;
country . put ( «Japan» , «Tokyo» ) ;
country . put ( «China» , «Beijing» ) ;
country = sortByKeys ( country ) ;
System . out . println ( «Sorted map by keys :\n» + country ) ;
результат:
Sorted map by keys :
Вот эквивалентная версия с использованием Stream API.
import java . util . * ;
import java . util . stream . Collectors ;
class Main
// Общий метод для сортировки карты по ключам с использованием `LinkedHashMap`
public static < K extends Comparable , V >Map < K , V >sortByKeys ( Map < K , V >map )
// создаем список ключей карты и сортируем его
List
Collections . sort ( keys ) ;
// для каждого ключа в отсортированном списке вставляем пару ключ-значение в
// упорядоченная вставка `LinkedHashMap`
return keys . stream ( ) . collect ( Collectors . toMap ( key -> key , map :: get ,
( a , b ) -> b , LinkedHashMap :: new ) ) ;
public static void main ( String [ ] args )
Map < String , String >country = new HashMap <> ( ) ;
country . put ( «India» , «New Delhi» ) ;
country . put ( «USA» , «Washington D.C.» ) ;
country . put ( «Japan» , «Tokyo» ) ;
country . put ( «China» , «Beijing» ) ;
country = sortByKeys ( country ) ;
System . out . println ( «Sorted map by keys :\n» + country ) ;
результат:
Sorted map by keys :
3. Использование Java 8
Мы также можем использовать Java 8 Stream для сортировки карты по ключам. Ниже приведены шаги:
- Получите поток из заданного представления сопоставлений, содержащихся в карте.
- Отсортируйте поток в естественном порядке ключей, используя Stream.sorted() метод путем передачи компаратора, возвращаемого Map.Entry.comparingByKey() .
- Соберите все отсортированные элементы в LinkedHashMap с использованием Stream.collect() с Collectors.toMap() .
Обратите внимание, что поток — это последовательность элементов, а не последовательность пар ключ/значение. Таким образом, мы не можем построить карту из потока, не указав, как извлекать из него ключи и значения. Java 8 обеспечивает Collectors.toMap() метод для этой цели. Нам нужно использовать перегруженную версию toMap() который возвращает LinkedHashMap вместо HashMap чтобы сохранить отсортированный порядок.
