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

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

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

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

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

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

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

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

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

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

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

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

 Set myOrderedSet = new LinkedHashSet(mySet); 

Чтобы сохранить список использования заказа или LinkedHashSet .

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

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

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

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

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

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

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

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

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

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

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

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

  • Сети не работают в свойствах зависимостей?
  • Установите программный код Android IP, DNS, GATEWAY
  • Неоднократно разбивать несколько массивов
  • ReactJS: Warning: setState (...): невозможно обновить во время существующего перехода состояния
  • Разница между Iterator и Listiterator?
  • Interesting Posts

    Поддерживает ли Dapper поддержку табличных значений SQL 2008?

    Остановить onclick при стрельбе, когда onclientclick является ложным?

    Как написать новый символ строки в файл в Java

    Почему исключения следует использовать консервативно?

    Разница между std :: regex_match и std :: regex_search?

    Можете ли вы получить доступ к элементам пользовательского интерфейса из другого streamа? (не задано)

    В чем разница между списками, заключенными в квадратные скобки и круглые скобки в Python?

    Могу ли я использовать два типа DDR3 на одной материнской плате?

    JSON stringify отсутствует в jQuery 1.4.1?

    Приступая к запуску программ запуска

    Помогите получить изображение с сервлета на страницу JSP

    «Не удалось найти основной class» при двойном щелчке .jar-файла

    Можно ли экспортировать функции из C # DLL, как в VS C ++?

    Как я могу подсчитать количество элементов заданного значения в матрице?

    Как упаковать переносимую библиотеку .NET, ориентированную на .NET Core?

    Давайте будем гением компьютера.