Как удалить из arraylist java повторяющиеся элементы
Перейти к содержимому

Как удалить из arraylist java повторяющиеся элементы

  • автор:

Как удалить одинаковые значения в списке ArrayList?

Если в коллекции необоходимо хранить элементы, которые не должны иметь дубликаты, то в таких случаях используется Set или одна из его реализаций.

Set – это коллекция уникальных элементов, или коллекция, которая не позволяет хранить одинаковые элементы.

Самый простой способ удалить повторяющиеся элементы — это добавить содержимое в Set (что не допустит дублирования), а затем добавить Set обратно в ArrayList :

// помещаем вашу коллекцию в сет Set set = new HashSet<>(id_); // чистим вашу коллекцию id_.clear(); // помещаем из коллекции сета обратно в вашу коллекцию, // которая на данный момент ещё пустая id_.addAll(set); 

Но стоит обратить внимание, что при добавлении обратно в ArrayList , порядок будет нарушен.

Можно так же использовать LinkedHashSet для сохранения порядка.

Set s = new LinkedHashSet<>(id_); 

В Java 8 можно удалить удалить дубликаты с помощью метода distinct() .

List listWithoutDuplicates = id_.stream().distinct().collect(Collectors.toList()); 

Удаление всех дубликатов из списка в 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 java

В Java для удаления элемента из ArrayList можно использовать метод remove() . Вот несколько примеров:

Удаление по индексу:

ArrayListString> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); // Удаляем элемент с индексом 1 (т.е. "banana") list.remove(1); 

Удаление по значению:

ArrayListString> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); // Удаляем элемент со значением "banana" list.remove("banana"); 

Удаление всех элементов, удовлетворяющих условию:

ArrayListInteger> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(2); list.add(4); // Удаляем все элементы со значением 2 list.removeIf(n -> n == 2); 

В этом примере мы используем метод removeIf() , который удаляет все элементы, удовлетворяющие заданному условию. В данном случае мы передаем лямбда-выражение n -> n == 2 , которое проверяет, равен ли элемент n значению 2.

Как удалить повторяющихся элементов из массива?

Написал такой код.Как используя remove() удалить повторяющихся элементов из массива?
Пишу set.remove(arr,j); дает ошибку почему?

  • Вопрос задан более трёх лет назад
  • 1838 просмотров

4 комментария

Простой 4 комментария

samodum

телепатов здесь нет
Шамиль Хайрулаев @ComPUCKter
Код ошибки какой?
Шамиль Хайрулаев @ComPUCKter
Зачем ты преобразуешь массив в строку?
Шамиль Хайрулаев @ComPUCKter
У тебя же set вообще пустой.
Решения вопроса 1

azerphoenix

Орхан Гасанлы @azerphoenix Куратор тега Java
Java Software Engineer

Добрый день!
Рекомендую изучить JCF. А также обратить внимание на Map тоже.
В Set элементы являются уникальными.
Соответственно, необязательно все проверять на равенство.
Достаточно итерировать по массиву int[] arr=; и добавить каждый элемент в Set. Повторяющиеся значения не будут добавлены

import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Main < public static void main(String[] args) < int[] arr=; Set set = new HashSet(); for (int i = 0; i < arr.length; i++) < set.add(arr[i]); >set.forEach(System.out::println); > >

Ответ написан более трёх лет назад
Нравится 1 4 комментария

Elxan24-03

Elxan Mecidli @Elxan24-03 Автор вопроса
А можно в мой код добавить что-то чтобы сработал?Я не до конца сделал

azerphoenix

Орхан Гасанлы @azerphoenix Куратор тега Java

package com.company; import java.util.Arrays; import java.util.LinkedHashSet; public class Praktika15 < public static void main(String[] args) < int[] arr=; System.out.println("Исходный массив:"+Arrays.toString(arr)); LinkedHashSet set=new LinkedHashSet(); for(int i =0;i < arr.length-1;i++)< set.add(arr[i]); >> >

Смысла реализовывать ваш код нет, так как он комплицирован.
1) вы итерируете двумя циклами по одному массиву, чтобы получить сам (элемент) и (элемент + 1).

for(int i =0;i< arr.length-1;i++)< for(int j=i+1;j< arr.length;j++)

2) Затем сравниваете (элемент) и (элемент+1)
if(arr[i]==arr[j])

3) А затем при выолнении условия удаляете элемент из LinkedHashSet.
set.remove();
Притом, что сам элемент никогда и не был добавлен в LinkedHashSet. А если добавить элемент в LinkedHashSet, то в силу того, что Set гарантирует уникальность элементов, то и смысла в ваших проверках не будет.

Отсюда простое решение - просто добавьте элементы в Set и они будут уникальными

Шамиль Хайрулаев @ComPUCKter

package com.company; import java.util.Arrays; import java.util.LinkedHashSet; public class Praktika15 < public static void main(String[] args) < int[] arr=; System.out.println("Исходный массив:"+Arrays.toString(arr)); LinkedHashSet set=new LinkedHashSet(); for(int i = 0; i < arr.length-1; i++) < set.add(arr[i]); >System.out.println("Новый массив: " + set); > >

Шамиль Хайрулаев @ComPUCKter

E Java, Проблема в том, что ты создал LinkedHashSet, но ничего в него не положил.
А это вообще не нужно :

for(int i =0;i < arr.length-1;i++)< for(int j=i+1;j< arr.length;j++)< if(arr[i]==arr[j])< set.remove(); >> >

так как, linkedHashSet сам удаляет одинаковые элементы внутри него

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *