Java Set сохранить порядок?

Сохраняет ли Java-набор порядок? Метод возвращает Set для меня и, предположительно, данные упорядочиваются, но итерации по Set, данные неупорядочены. Есть ли лучший способ справиться с этим? Нужно ли менять метод для возврата чего-то другого, кроме Set?

Ответ 1

Интерфейс Set не предоставляет никаких гарантий заказа.

Его подчиненный интерфейс SortedSet представляет собой набор, который отсортирован по некоторому критерию. В Java 6 есть два стандартных контейнера, которые реализуют SortedSet. Это TreeSet и ConcurrentSkipListSet.

В дополнение к интерфейсу SortedSet есть также класс LinkedHashSet. Он запоминает порядок, в котором элементы были вставлены в набор, и возвращает его элементы в этом порядке.

Ответ 2

LinkedHashSet - это то, что вам нужно.

Ответ 3

Поскольку многие участники предложили использовать LinkedHashSet, чтобы сохранить порядок коллекции. Вы можете обернуть ваш набор с помощью этой реализации.

Реализация SortedSet может использоваться для сортированного порядка, но для ваших целей используйте LinkedHashSet.

Также из документов,

"Эта реализация избавляет своих клиентов от неопределенного, обычно хаотического порядка, предоставляемого HashSet, без увеличения стоимости, связанного с TreeSet. Его можно использовать для создания копии набора, который имеет тот же порядок, что и оригинал, независимо от оригинала установить реализацию: "

Источник: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

Ответ 4

Набор - это просто интерфейс. Чтобы сохранить порядок, вы должны использовать конкретную реализацию этого интерфейса и суб-интерфейс SortedSet, например TreeSet или LinkedHashSet. Вы можете обернуть свой набор так:

Set myOrderedSet = new LinkedHashSet(mySet);

Ответ 5

Чтобы сохранить порядок, используйте List или LinkedHashSet.

Ответ 6

Вот краткое описание характеристик порядка стандартных реализаций Set доступных в Java:

  1. сохранить порядок вставки: LinkedHashSet и CopyOnWriteArraySet (токарно-сейф)
  2. сохранить элементы, отсортированные в наборе: TreeSet, EnumSet (специфично для перечислений) и ConcurrentSkipListSet (поточно-ориентированный)
  3. не хранит элементы в каком-либо определенном порядке: HashSet (тот, который вы пробовали)

Для вашего конкретного случая, вы можете сортировать элементы первым, а затем использовать любого из 1 или 2 (скорее всего LinkedHashSet или TreeSet). Или, альтернативно и более эффективно, вы можете просто добавить несортированные данные в TreeSet который автоматически позаботится о сортировке.

Ответ 7

LinkedHashSet - это упорядоченная версия HashSet, которая поддерживает двусвязный список для всех элементов. Используйте этот класс вместо HashSet, если вам важен порядок итераций.

Ответ 8

Из javadoc для Set.iterator():

Возвращает итератор по элементам этого набора. Элементы возвращаются в определенном порядке (если этот набор не является экземпляром какого-либо класса, который предоставляет гарантию).

И, как уже сказано shuuchan, TreeSet является реализацией Set, которая имеет гарантированный порядок:

Элементы упорядочиваются с использованием их естественного упорядочения или с помощью компаратора, предоставленного в заданное время создания, в зависимости от того, какой конструктор используется.

Ответ 9

Обычно набор не поддерживает порядок, например HashSet, чтобы быстро найти emelent, но вы можете попробовать LinkedHashSet, он будет хранить порядок, который вы вставляете.

Ответ 10

В самом интерфейсе Set не оговаривается какой-либо конкретный порядок. Тем не менее SortedSet.

Ответ 12

Есть 2 разные вещи.

  1. Сортировка элементов в наборе. Для которого у нас есть SortedSet и simillar Реализации.
  2. Поддерживать порядок вставки в наборе. Для которого LinkedHashSet и CopyOnWriteArraySet (потокобезопасный) могут быть использованы.

Ответ 13

Только SortedSet может выполнить упорядочение Set