Сохраняет ли Java-набор порядок? Метод возвращает Set для меня и, предположительно, данные упорядочиваются, но итерации по Set, данные неупорядочены. Есть ли лучший способ справиться с этим? Нужно ли менять метод для возврата чего-то другого, кроме Set?
Java 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:
- сохранить порядок вставки: LinkedHashSet и CopyOnWriteArraySet (токарно-сейф)
- сохранить элементы, отсортированные в наборе: TreeSet, EnumSet (специфично для перечислений) и ConcurrentSkipListSet (поточно-ориентированный)
- не хранит элементы в каком-либо определенном порядке: HashSet (тот, который вы пробовали)
Для вашего конкретного случая, вы можете сортировать элементы первым, а затем использовать любого из 1 или 2 (скорее всего LinkedHashSet
или TreeSet
). Или, альтернативно и более эффективно, вы можете просто добавить несортированные данные в TreeSet
который автоматически позаботится о сортировке.
Ответ 7
LinkedHashSet - это упорядоченная версия HashSet, которая поддерживает двусвязный список для всех элементов. Используйте этот класс вместо HashSet, если вам важен порядок итераций.
Ответ 8
Из javadoc для Set.iterator()
:
Возвращает итератор по элементам этого набора. Элементы возвращаются в определенном порядке (если этот набор не является экземпляром какого-либо класса, который предоставляет гарантию).
И, как уже сказано shuuchan, TreeSet
является реализацией Set
, которая имеет гарантированный порядок:
Элементы упорядочиваются с использованием их естественного упорядочения или с помощью компаратора, предоставленного в заданное время создания, в зависимости от того, какой конструктор используется.
Ответ 9
Обычно набор не поддерживает порядок, например HashSet, чтобы быстро найти emelent, но вы можете попробовать LinkedHashSet, он будет хранить порядок, который вы вставляете.
Ответ 10
В самом интерфейсе Set не оговаривается какой-либо конкретный порядок. Тем не менее SortedSet.
Ответ 11
Итератор, возвращаемый Set, не должен возвращать данные в порядке заказа. Посмотрите Два java.util.Iterators в один и тот же набор: нужно ли возвращать элементы в том же порядке?
Ответ 12
Есть 2 разные вещи.
- Сортировка элементов в наборе. Для которого у нас есть SortedSet и simillar Реализации.
- Поддерживать порядок вставки в наборе. Для которого LinkedHashSet и CopyOnWriteArraySet (потокобезопасный) могут быть использованы.
Ответ 13
Только SortedSet
может выполнить упорядочение Set