Чи зберігає набір Java комплект? Метод повертає мені набір, і нібито дані впорядковані, але повторюються над набором, дані не упорядковані. Чи є кращий спосіб управління цим? Чи потрібно змінювати метод, щоб повернути щось, крім набору?
Чи зберігає набір Java комплект? Метод повертає мені набір, і нібито дані впорядковані, але повторюються над набором, дані не упорядковані. Чи є кращий спосіб управління цим? Чи потрібно змінювати метод, щоб повернути щось, крім набору?
Відповіді:
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 myOrderedSet = new LinkedHashSet(mySet);
Ось короткий підсумок характеристик замовлення стандартних Set
реалізацій, наявних на Java:
Для вашого конкретного випадку ви можете спочатку сортувати елементи, а потім використовувати будь-який з 1 або 2 (швидше за все, LinkedHashSet
або TreeSet
). Або, як альтернативу та ефективніше , ви можете просто додати несортовані дані до того, TreeSet
що автоматично потурбується про сортування.
Для того, щоб зберегти використання замовлення List
або її LinkedHashSet
.
LinkedHashSet
ні ... Map
.
LinkedHashSet - це впорядкована версія HashSet, яка підтримує подвійно пов'язаний Список для всіх елементів. Використовуйте цей клас замість HashSet, коли ви дбаєте про порядок ітерації.
Від javadoc за Set.iterator()
:
Повертає ітератор над елементами цього набору. Елементи повертаються не в конкретному порядку (якщо тільки цей набір не є екземпляром якогось класу, який забезпечує гарантію).
І, як уже говорив shuuchan , a TreeSet
- це реалізація, Set
яка має гарантований порядок:
Елементи впорядковуються за допомогою їх природного упорядкування або компаратором, який надається у встановлений час створення, залежно від того, який конструктор використовується.
Зазвичай встановлений не підтримує замовлення, наприклад, HashSet, щоб швидко знайти смарагду, але ви можете спробувати LinkedHashSet, він буде зберігати порядок, який ви ввели.
Сам інтерфейс Set не передбачає конкретного замовлення. Однак сортується .
Ітератор, повернутий Set, не повинен повертати дані впорядкованим чином. Дивіться це два java.util.Iterators до тієї ж колекції: чи повинні вони повертати елементи в одному порядку?
Впорядкувати SortedSet
замовлення можна лишеSet