Сортировка hashmap java по значению

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.

Читайте также:  Excel vba вставить формулу в ячейку

Во-первых, давайте добавим несколько повторяющихся записей на нашу исходную карту:

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, как поток для каждого и т. Д.

Карта будет отсортирована по ключам, если значения одинаковы

плюса

529 Репутация автора

-1 плюса

Читайте также:  Заменил жесткий диск как установить windows

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:

Ссылка на основную публикацию
Adblock
detector