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

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

12 ответов


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

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

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


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


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

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

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

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

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


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

Set myOrderedSet = new LinkedHashSet(mySet);

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


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

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

и, как уже сказал shuuchan, a TreeSet - это мастер-класс Set который имеет гарантированный заказ:

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


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


вот краткое резюме характеристик заказа стандарта Set реализации, доступные в Java:

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

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


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


сам интерфейс набора не предусматривает какого-либо конкретного порядка. The объект sortedset делает.


итератор, возвращаемый Set, не должен возвращать данные упорядоченным образом. Смотрите это два java.утиль.Итераторы в ту же коллекцию: должны ли они возвращать элементы в том же порядке?


только SortedSet может сделать заказ Set