У меня есть ArrayList<String>
, и я хочу удалить повторяющиеся строки из него. Как я могу это сделать?
java
list
collections
arraylist
duplicates
user25778
источник
источник
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
иSet
(вместо типов реализацииArrayList
иHashSet
как в вашем примере).new HashSet(al)
вместо инициализации его пустым и вызываяaddAll
.Object
имеет несколько значений, если два из них повторяются, я считаю их дубликатами (другие значения могут отличаться) и используюSet
?Несмотря на то, преобразуя
ArrayList
кHashSet
эффективно удаляет дубликаты, если вам нужно , чтобы сохранить порядок вставки, я предпочел бы предложить вам использовать этот вариантЗатем, если вам нужно вернуть
List
ссылку, вы можете снова использовать конструктор преобразования.источник
В Java 8:
Обратите внимание, что для правильной работы фильтрации следует соблюдать контракт hashCode-equals для членов списка.
источник
addAll
к которому вы можетеnew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. Первый добавленный элемент останется в наборе, поэтому, если ваш список содержит «Dog» и «Dog» (в этом порядке), онTreeSet
будет содержать «Dog». Если порядок должен быть сохранен, то перед строкой в ответе поставитьlist.replaceAll(String::toUpperCase);
.Предположим, у нас есть список
String
как:Затем мы можем удалить дубликаты элементов несколькими способами.
До Java 8
Примечание: если мы хотим сохранить порядок вставки, нам нужно использовать
LinkedHashSet
вместоHashSet
Использование гуавы
Использование Java 8
Примечание. В случае, если мы хотим собрать результат в конкретной реализации списка, например,
LinkedList
тогда мы можем изменить приведенный выше пример следующим образом:Мы можем использовать
parallelStream
также в приведенном выше коде, но он может не дать ожидаемых преимуществ производительности. Проверьте этот вопрос для получения дополнительной информации.источник
parallel streams
это всегда даст лучшую производительность. Но это миф. Позже я узнал, что есть определенные сценарии, где следует использовать параллельные потоки. В этом сценарии параллельные потоки не дадут лучшей производительности. и да, параллельные потоки могут не дать желаемых результатов в некоторых случаях.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
должно быть подходящее решение в этом случаеЕсли вы не хотите дубликатов, используйте Set вместо a
List
. Для преобразованияList
в aSet
вы можете использовать следующий код:Если действительно необходимо, вы можете использовать ту же конструкцию, чтобы преобразовать
Set
обратно вList
.источник
Set
не может быть использовано здесь.Вы также можете сделать это таким образом и сохранить порядок:
источник
Потоки Java 8 предоставляют очень простой способ удаления дублирующихся элементов из списка. Используя отличный метод. Если у нас есть список городов, и мы хотим удалить дубликаты из этого списка, это можно сделать в одну строку -
Как удалить дубликаты элементов из массива
источник
Вот способ, который не влияет на порядок составления списка:
l1 - исходный список, а l2 - список без повторяющихся элементов (убедитесь, что у YourClass есть метод equals в соответствии с тем, что вы хотите отстаивать для равенства)
источник
ArrayList<T>
следует использовать вместоArrayList
) 2) явного создания итератора можно избежать с помощью afor (T current : l1) { ... }
. Даже если вы хотели использоватьIterator
явно, сiterador
ошибкой.Можно удалить дубликаты из массива без использования HashSet или еще одного массива .
Попробуйте этот код ..
Выход
источник
ImmutableSet.copyOf(lst).toList()
.indexOf
повторяетlst
использование цикла for.Также есть вариант
ImmutableSet
из Гуавы ( вот документация):источник
ImmutableSet.asList()
метод, возвращающийImmutableList
, если вам нужно вернуть его какList
.это может решить проблему:
источник
Возможно, это немного излишне, но мне нравится такая изолированная проблема. :)
Этот код использует временный набор (для проверки уникальности), но удаляет элементы непосредственно внутри исходного списка. Так как удаление элемента внутри ArrayList может вызвать огромное количество копирования массива, метод удаления (int) избегается.
Пока мы на этом, вот версия для LinkedList (намного лучше!):
Используйте интерфейс маркера, чтобы представить унифицированное решение для List:
РЕДАКТИРОВАТЬ: Я думаю, что дженерики действительно не добавляет никакой ценности здесь ... Ну, хорошо. :)
источник
источник
Если вы желаете использовать стороннюю библиотеку, вы можете использовать метод
distinct()
в Eclipse Collections (ранее GS Collections).Преимущество использования
distinct()
вместо преобразования в набор, а затем обратно в список состоит в том, чтоdistinct()
сохраняется порядок исходного списка, сохраняя первое вхождение каждого элемента. Это реализовано с использованием как Set, так и List.Если вы не можете преобразовать свой исходный список в тип коллекций Eclipse, вы можете использовать ListAdapter для получения того же API.
Примечание: я являюсь коммиттером для Eclipse Collections.
источник
Эти три строки кода могут удалить дублированный элемент из ArrayList или любой коллекции.
источник
Когда вы заполняете ArrayList, используйте условие для каждого элемента. Например:
Мы получим массив {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
источник
Если вы хотите сохранить свой заказ, то лучше всего использовать LinkedHashSet . Потому что, если вы хотите передать этот список в запрос на вставку путем его итерации, порядок будет сохранен.
Попробуй это
Это преобразование будет очень полезно, когда вы хотите вернуть список, но не набор.
источник
Код:
Примечание: определенно, будут накладные расходы памяти.
источник
источник
LinkedHashSet сделает свое дело.
// вывод: 5,1,2,3,4
источник
источник
Это используется для вашего списка пользовательских объектов
источник
Вы можете использовать вложенный цикл в следующем:
источник
Как сказано выше, вы должны использовать класс, реализующий интерфейс Set вместо List, чтобы быть уверенным в уникальности элементов. Если вам нужно сохранить порядок элементов, можно использовать интерфейс SortedSet; класс TreeSet реализует этот интерфейс.
источник
Если вы используете модель типа List <T> / ArrayList <T>. Надеюсь, это поможет вам.
Вот мой код без использования какой-либо другой структуры данных, такой как set или hashmap
источник
источник
источник
источник
источник
Если вы хотите удалить дубликаты из ArrayList, найдите приведенную ниже логику,
источник