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. Тому що, якщо ви хочете передати цей список у запит на вставку шляхом його ітерації, порядок буде збережено.
Це перетворення буде дуже корисним, якщо ви хочете повернути список, але не набір.