Java значень унікальних - Як видалити елементи, що повторюються, з ArrayList CODE Q - A розв’язувана

Якщо ви не хочете дублікатів у Collection , вам слід подумати про те, чому ви використовуєте Collection яка дозволяє дублювати. Найпростіший спосіб видалити елементи, що повторюються - це додати вміст в Set (який не дозволить дублювати), а потім додати Set назад в ArrayList :

Звичайно, це руйнує впорядкування елементів ArrayList .

У мене є ArrayList , і я хочу видалити з нього рядки, що повторюються. Як я можу це зробити?

Зверніть увагу, що для відповідності hashCode-equals для учасників списку повинен дотримуватися контракту hashCode-equals .

Припустимо, що у нас є список String :

Потім ми можемо видалити елементи, що повторюються, декількома способами.

Примітка. Якщо ми хочемо зберегти порядок вставки, нам потрібно використовувати LinkedHashSet замість HashSet

Використання Guava

Використання Java 8

Примітка. Якщо ми хочемо зібрати результат уконкретної реалізації списку, наприклад LinkedList ми можемо змінити наведений вище приклад як:

Ви також можете зробити це таким чином і зберегти порядок:

Існує також ImmutableSet від Guava як опція ( here документація):

Напевно, трохи переборщив, але мені подобається така ізольована проблема. :)

Цей код використовує тимчасовий набір (для перевірки унікальності), але видаляє елементи у вихідному списку. Оскільки видалення елемента всередині ArrayList може викликати величезну кількість копій масивів, remove (int) метод виключається.

Поки ми на ньому, ось версія для LinkedList (набагато краще!):

Використовуйте інтерфейс маркера для представлення єдиного рішення длясписку:

EDIT: Я думаю, що дженерики взагалі не додають жодної цінності. О, добре. :)

Ці три рядки коду можуть видалити дубльований елемент ArrayList або будь-якої колекції.

Якщо ви хочете зберегти своє замовлення, краще використовуватиLinkedHashSet. Тому що, якщо ви хочете передати цей список у запит на вставку шляхом його ітерації, порядок буде збережено.

Це перетворення буде дуже корисним, якщо ви хочете повернути список, але не набір.