- 1. Вступление
- 2. Использование TreeMap
- 3. Использование ArrayList
- 3.1. Сортировать по ключу
- 3.2. Сортировать по значению
- 4. Использование TreeSet
- 4.1. Сортировать по ключу
- 4.2. Сортировать по значению
- 5. Использование лямбд и Stream API
- 5.1. Сортировать по ключу
- 5.2. Сортировать по значению
- 6. Использование Guava
- 7. Резюме
- Ответы (12)
- 5 ответов 5
1. Вступление
В этом кратком руководстве вы узнаете, как отсортировать HashMap в Java.
В частности, рассмотрим сортировку записей HashMap по их ключу или значению, используя
- TreeMap
- ArrayList and Collections.sort()
- TreeSet
- Использование Stream API
- Использование библиотеки Guava
2. Использование TreeMap
Как мы знаем, ключи в TreeMap отсортированы в естественном порядке. Это хорошее решение, когда мы хотим отсортировать пары значений ключей по их ключам. Таким образом, идея состоит в том, чтобы поместить все данные из нашей HashMap в TreeMap.
Для начала давайте определим HashMap и инициализируем его некоторыми данными.
Для класса Employee обратите внимание, что мы реализовали Comparable
Далее мы сохраняем записи в TreeMap, используя его конструктор
Или метод putAll для копирования данных
И это все! Чтобы убедиться, что записи нашей карты отсортированы по ключу, давайте выведем их:
Как видим, ключи отсортированы в естественном порядке.
3. Использование ArrayList
Конечно, мы можем сортировать записи карты с помощью ArrayList. Основное отличие от предыдущего метода заключается в том, что мы не поддерживаем интерфейс Map.
3.1. Сортировать по ключу
Давайте загрузим набор ключей в ArrayList:
3.2. Сортировать по значению
Теперь, что если мы хотим отсортировать значения нашей карты по полю id объекта Employee? Мы также можем использовать ArrayList для этого.
Во-первых, давайте скопируем значения в список:
И после этого мы сортируем:
Помните, что это работает, потому что Employee реализует интерфейс Comparable. В противном случае нам нужно определить ручной компаратор для нашего вызова Collections.sort.
Чтобы проверить результаты, мы печатаем employeeById:
Как видим, объекты сортируются по полю id.
4. Использование TreeSet
В случае, если мы не хотим принимать повторяющиеся значения в нашей отсортированной коллекции, есть хорошее решение с TreeSet.
Во-первых, давайте добавим несколько повторяющихся записей на нашу исходную карту:
4.1. Сортировать по ключу
Сортировать карту по ключевым записям:
Выведем keySet и увидим в консоли:
Теперь у нас есть ключи карты, отсортированные без дубликатов.
4.2. Сортировать по значению
Аналогично, для значений карты код преобразования выглядит следующим образом:
Как мы видим, в выходных данных нет дубликатов. Это работает с пользовательскими объектами, когда мы переопределяем equals и hashCode.
5. Использование лямбд и Stream API
Начиная с Java, мы можем использовать Stream API и лямбда-выражения для сортировки карты. Все, что нам нужно, это вызвать отсортированный метод по конвейеру потока карт.
5.1. Сортировать по ключу
Для сортировки по ключу мы используем компаратор comparingByKey:
Финальный этап forEach распечатывает результаты:
По умолчанию сортировка по возрастанию.
5.2. Сортировать по значению
Конечно, мы можем сортировать и объекты Employee.
Как мы видим, приведенный выше код распечатывает карту, отсортированную по полям id объектов Employee.
Кроме того, мы можем собрать результаты в новую карту:
Обратите внимание, что мы собрали наши результаты в LinkedHashMap. По умолчанию Collectors.toMap возвращает новый HashMap, но, как мы знаем, HashMap не гарантирует порядок итераций, в то время как LinkedHashMap гарантирует.
6. Использование Guava
Наконец, библиотека, которая позволяет нам сортировать HashMap — это Guava.
Во-первых, давайте объявим Ordering, так как мы хотим отсортировать нашу карту по полю «Идентификатор сотрудника».
Теперь все, что нам нужно, это использовать ImmutableSortedMap, чтобы проиллюстрировать результаты:
И снова, на выходе получается карта, упорядоченная по полю id:
7. Резюме
В этой статье мы рассмотрели несколько способов сортировки HashMap по ключу или по значению.
И мы внимательно рассмотрели, как мы можем сделать это, когда атрибут является пользовательским классом, реализуя Comparable.
328909 просмотра
12 ответа
823 Репутация автора
На этот вопрос уже есть ответ здесь:
Мне нужно отсортировать в HashMap соответствии со значениями, хранящимися в нем. HashMap Содержит имя контактов , сохраненных в телефоне.
Также мне нужно, чтобы ключи сортировались автоматически, как только я сортирую значения, или вы можете сказать, что ключи и значения связаны друг с другом, поэтому любые изменения значений должны отражаться в ключах.
Ответы (12)
24 плюса
1120175 Репутация автора
Вы не в основном. А HashMap принципиально неупорядочен. На любые шаблоны, которые вы можете увидеть в заказе, не следует полагаться.
Существуют отсортированные карты, например TreeMap , но они традиционно сортируются по ключу, а не по значению. Сортировка по значению довольно необычна, тем более что несколько ключей могут иметь одинаковое значение.
Можете ли вы дать больше контекста для того, что вы пытаетесь сделать? Если вы на самом деле храните только цифры (в виде строк) для ключей, возможно, SortedSet такой TreeSet будет работать для вас?
В качестве альтернативы, вы могли бы хранить две отдельные коллекции, инкапсулированные в одном классе, чтобы обновлять оба одновременно?
82 плюса
8299 Репутация автора
Предполагая Java, вы можете отсортировать hashmap так:
Просто начальный пример. Этот способ более полезен, так как он сортирует HashMap и сохраняет также дублирующиеся значения.
155 плюса
5878 Репутация автора
Попробуйте приведенный ниже код, он отлично работает для меня. Вы можете выбрать как по возрастанию, так и по убыванию
Редактировать: версия 2
Используется новая функция Java, как поток для каждого и т. Д.
Карта будет отсортирована по ключам, если значения одинаковы
0 плюса
529 Репутация автора
-1 плюса
399 Репутация автора
59 плюса
80765 Репутация автора
-2 плюса
9 Репутация автора
2 плюса
2338 Репутация автора
нашел решение, но не уверен, производительность, если карта имеет большой размер, полезно для обычного случая.
Автор: lannyf Размещён: 20.07.2014 01:55
7 плюса
359 Репутация автора
В качестве простого решения вы можете использовать временный TreeMap, если вам нужен только конечный результат:
Это позволит вам отсортировать строки как ключи sortedMap.
15 плюса
150 Репутация автора
9 плюса
91 Репутация автора
4 плюса
1613 Репутация автора
Я расширяю TreeMap и переопределяю методы entrySet () и values (). Ключ и значение должны быть сопоставимы.
Есть map , как ее отсортировать по значению?
5 ответов 5
java 8
Вывод:
Сходу написать такой сортировщик не так просто. По крайней мере, я для себя выбрал в этом случае такую стратегию: раз написал, много раз используй. Поэтому такой сортировщик я написал через Generics т.к. в map может иметь и другие типы в качестве ключа и значения.
Ниже я поделюсь двумя версиями сортировочного метода. Для Java version = 7 и для Java version = 8 .
Итак, если у Вас 7-я версия Java:
Т.е., сначала, как писал @Nofate, вытаскиваем список entries (это у нас переменная list ), затем сортируем эти entries по значениям и заливаем в новую мапу (это у нас result ). Для результирующей мапы я использовал LinkedHashMap чтобы при добавлении элементы не пересортировывались.
А вот версия с использованием Stream ‘ов из Java 8: