Сохраняет ли Java-набор порядок? Метод возвращает мне Set, и, предположительно, данные упорядочены, но итерируя по Set, данные неупорядочены. Есть ли лучший способ справиться с этим? Нужно ли менять метод, чтобы он возвращал что-то отличное от Set?
179
Ответы:
Set
Интерфейс не дает никаких гарантий заказа.Его подчиненный интерфейс
SortedSet
представляет собой набор, отсортированный по некоторому критерию. В Java 6 есть два стандартных контейнера, которые реализуютSortedSet
. Они естьTreeSet
иConcurrentSkipListSet
.Помимо
SortedSet
интерфейса есть еще иLinkedHashSet
класс. Он запоминает порядок, в котором элементы были вставлены в набор, и возвращает его элементы в этом порядке.источник
LinkedHashSet - это то, что вам нужно.
источник
List
не являетсяSet
(это не гарантирует уникальность членства).Поскольку многие из участников предложили использовать LinkedHashSet, чтобы сохранить порядок коллекции. Вы можете обернуть ваш набор с помощью этой реализации.
Реализация SortedSet может использоваться для сортированного порядка, но для вашей цели используйте LinkedHashSet .
Также из документов,
«Эта реализация избавляет своих клиентов от неуказанного, обычно хаотического порядка, предоставляемого HashSet, без увеличения стоимости, связанного с TreeSet. Его можно использовать для создания копии набора, который имеет тот же порядок, что и оригинал, независимо от оригинала реализация набора: "
Источник: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
источник
Набор это просто интерфейс. Чтобы сохранить порядок, вы должны использовать конкретную реализацию этого интерфейса и подчиненного интерфейса SortedSet, например TreeSet или LinkedHashSet. Вы можете обернуть ваш набор следующим образом:
источник
Вот краткий обзор характеристик порядка стандартных
Set
реализаций, доступных в Java:Для вашего конкретного случая вы можете сначала отсортировать элементы, а затем использовать любой из 1 или 2 (наиболее вероятно,
LinkedHashSet
илиTreeSet
). Или, альтернативно и более эффективно , вы можете просто добавить несортированные данные в папку,TreeSet
которая автоматически позаботится о сортировке.источник
Для сохранения заказа используйте
List
илиLinkedHashSet
.источник
LinkedHashSet
не ...Map
.LinkedHashSet - это упорядоченная версия HashSet, которая поддерживает двусвязный список для всех элементов. Используйте этот класс вместо HashSet, если вам важен порядок итераций.
источник
Из Javadoc для
Set.iterator()
:И, как уже заявлено shuuchan , a
TreeSet
является реализацией,Set
которая имеет гарантированный порядок:источник
Обычно установленный не сохраняет порядок, такой как HashSet, чтобы быстро найти изумруд, но вы можете попробовать LinkedHashSet, он сохранит порядок, в который вы положили.
источник
Есть 2 разные вещи.
источник
Сам интерфейс Set не предусматривает какого-либо конкретного порядка. SortedSet делает однако.
источник
Итератор, возвращаемый Set, не должен возвращать данные Упорядоченным способом. Посмотрите это Два java.util.Iterators к одной коллекции: они должны возвращать элементы в том же порядке?
источник
Только
SortedSet
может сделать заказSet
источник