Удаление всех дубликатов из списка в Java
В этом кратком руководстве мы узнаем , как удалить повторяющиеся элементы из списка. Сначала мы будем использовать обычную Java, затем Guava и, наконец, решение на основе Java 8 Lambda.
Этот учебник является частью серии « Java — Back to Basic » здесь, на ForEach.
2. Удалите дубликаты из списка, используя обычную Java
Мы можем легко удалить повторяющиеся элементы из списка с помощью стандартной Java Collections Framework через Set :
public void givenListContainsDuplicates_whenRemovingDuplicatesWithPlainJava_thenCorrect() ListInteger> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0); ListInteger> listWithoutDuplicates = new ArrayList>( new HashSet>(listWithDuplicates)); assertThat(listWithoutDuplicates, hasSize(5)); assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2)); >
Как мы видим, исходный список остался без изменений.
В приведенном выше примере мы использовали реализацию HashSet , которая представляет собой неупорядоченную коллекцию. В результате порядок очищенного listWithoutDuplicates может отличаться от порядка исходного listWithDuplicates .
Если нам нужно сохранить порядок, мы можем вместо этого использовать LinkedHashSet :
public void givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithPlainJava_thenCorrect() ListInteger> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0); ListInteger> listWithoutDuplicates = new ArrayList>( new LinkedHashSet>(listWithDuplicates)); assertThat(listWithoutDuplicates, hasSize(5)); assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2)); >
3. Удалить дубликаты из списка с помощью гуавы
Мы можем сделать то же самое, используя Guava:
public void givenListContainsDuplicates_whenRemovingDuplicatesWithGuava_thenCorrect() ListInteger> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0); ListInteger> listWithoutDuplicates = Lists.newArrayList(Sets.newHashSet(listWithDuplicates)); assertThat(listWithoutDuplicates, hasSize(5)); assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2)); >
Здесь также первоначальный список остается без изменений.
Опять же, порядок элементов в очищаемом списке может быть случайным.
Если мы используем реализацию LinkedHashSet , мы сохраним исходный порядок:
public void givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithGuava_thenCorrect() ListInteger> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0); ListInteger> listWithoutDuplicates = Lists.newArrayList(Sets.newLinkedHashSet(listWithDuplicates)); assertThat(listWithoutDuplicates, hasSize(5)); assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2)); >
4. Удаление дубликатов из списка с помощью Java 8 Lambdas
Наконец, давайте рассмотрим новое решение, использующее лямбда-выражения в Java 8. Мы будем использовать метод different () из Stream API, который возвращает поток, состоящий из отдельных элементов, на основе результата, возвращаемого методом equals() .
Кроме того, для упорядоченных потоков выбор отдельных элементов является стабильным . Это означает, что для повторяющихся элементов сохраняется элемент, появляющийся первым в порядке обнаружения:
public void givenListContainsDuplicates_whenRemovingDuplicatesWithJava8_thenCorrect() ListInteger> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0); ListInteger> listWithoutDuplicates = listWithDuplicates.stream() .distinct() .collect(Collectors.toList()); assertThat(listWithoutDuplicates, hasSize(5)); assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2)); >
Итак, у нас есть три быстрых способа удалить все повторяющиеся элементы из списка.
5. Вывод
В этой статье мы продемонстрировали, как легко удалить дубликаты из списка с помощью простой Java, Google Guava и Java 8.
Реализацию всех этих примеров и сниппетов можно найти в проекте GitHub . Это проект на основе Maven, поэтому его легко импортировать и запускать.
- 1. Введение
- 2. Удалите дубликаты из списка, используя обычную Java
- 3. Удалить дубликаты из списка с помощью гуавы
- 4. Удаление дубликатов из списка с помощью Java 8 Lambdas
- 5. Вывод
Как удалить одинаковые элементы ArrayList
Есть ArrayList. Он String. Там куча ссылок на картинки. Некоторые ссылки повторяются. Как удалить повторяшки?
2 for тут не подходит. Потому что меняется количество элементов в Array.
Мне говорили, что «итератором нужно». Но к какому месту его приложить так и не объяснили.
Подскажите пожалуйста.
ПС элементы не сортированные. То есть одинаковым может быть 5 10 и 25 элемент
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как представить элементы java.ArrayList содержащие другие java.ArrayList в виде XML — XSL?
Здравствуйте Вопрос: Подскажите пожалуйста чайнику, как можно представить элементы.

Удалить одинаковые элементы таблицы
Таблица задана как List<List<Integer>> table = . это нельзя менять по условию задачи, нужно.
Найти и удалить в строке одинаковые элементы, идущие друг за другом
Задание — "Разработать программу, которая вводит текст, заменяет в нем стоящие подряд одинаковые.
Как удалить одинаковые элементы из массива?
Подскажите как удалить одинаковые элементы или например все одинаковые цифры (2) из одномерного.
Удаление повторяющихся элементов из ArrayList в Java
Часто в процессе работы с коллекциями в Java возникает необходимость удалить повторяющиеся элементы. Рассмотрим пример: есть ArrayList , который содержит несколько одинаковых строк. Задача состоит в том, чтобы оставить только уникальные строки, то есть удалить повторения.
ArrayList<String> list = new ArrayList<String>(); list.add("Java"); list.add("Python"); list.add("Java"); list.add("Ruby"); list.add("Python");
В данном примере, строки «Java» и «Python» повторяются два раза. В итоге, нужно получить ArrayList без повторений: «Java», «Python», «Ruby».
Существует несколько способов решения данной задачи.
Использование HashSet
Один из простейших способов — использование HashSet . HashSet в Java представляет собой коллекцию, которая не содержит повторяющихся элементов. При добавлении элемента в HashSet , который уже там присутствует, он просто не будет добавлен.
Set<String> set = new HashSet<>(list);
Далее, можно преобразовать HashSet обратно в ArrayList следующим образом:
list.clear(); list.addAll(set);
В результате, ArrayList list будет содержать только уникальные строки.
Использование Stream API
В Java 8 было введено Stream API, которое также позволяет решить данную задачу. С помощью метода distinct() , который возвращает стрим без дубликатов, можно удалить повторяющиеся элементы:
List<String> unique = list.stream().distinct().collect(Collectors.toList());
В данном случае, создается новый ArrayList unique , который содержит только уникальные строки из list .
Оба представленных способа эффективны для удаления повторяющихся элементов из ArrayList в Java. Выбор конкретного метода зависит от конкретных условий и требований к коду.
Удалить дубликаты из списка в Java
В этом посте будет обсуждаться, как удалить дубликаты из списка в Java, не нарушая исходный порядок элементов списка.
1. Обычная Java
Мы знаем, что множество не допускает повторяющихся элементов. Итак, если мы преобразуем данный список с дубликатами в набор, мы получим набор элементов из списка без дубликатов. Если мы преобразуем набор обратно в список, мы получим список без дубликатов.
Обратите внимание, что HashSet разрушит порядок элементов. Чтобы сохранить исходный порядок, мы можем использовать LinkedHashset вместо.