Удаление дубликатов из ArrayList на Java — HashSet и Stream

Пример 1: Удаление дубликатов из ArrayList с помощью Set

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

class Main {
  public static void main(String[] args) {

    // create an arraylist from the array
    // using asList() method of the Arrays class
    ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 1, 3));
    System.out.println("ArrayList with duplicate elements: " + numbers);

    // convert the arraylist into a set
    Set<Integer> set = new LinkedHashSet<>();
    set.addAll(numbers);

    // delete al elements of arraylist
    numbers.clear();

    // add element from set to arraylist
    numbers.addAll(set);
    System.out.println("ArrayList without duplicate elements: " + numbers);
  }
}

Вывод:

ArrayList with duplicate elements: [1, 2, 3, 4, 1, 3]
ArrayList without duplicate elements: [1, 2, 3, 4]

В приведённом примере мы создали ArrayList с именем numbers. Список содержит дубликаты.

Чтобы удалить дубликаты, мы:

  • добавляем все элементы из ArrayList во множество;

  • очищаем ArrayList с помощью метода clear();

  • добавляем все элементы из множества обратно в ArrayList.

Совет

Мы использовали LinkedHashSet для создания множества, потому что он удаляет дубликаты и сохраняет порядок вставки.

Пример 2: Удаление дубликатов из ArrayList с помощью Stream

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Main {
  public static void main(String[] args) {

    // create an arraylist from the array
    // using asList() method of the Arrays class
    ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 1, 3));
    System.out.println("ArrayList with duplicate elements: " + numbers);

    // create a stream from arraylist
    Stream<Integer> stream = numbers.stream();

    // call the distinct() of Stream
    // to remove duplicate elements
    stream = stream.distinct();

    // convert the stream to arraylist
    numbers = (ArrayList<Integer>)stream.collect(Collectors.toList());
    System.out.println("ArrayList without duplicate elements: " + numbers);

  }
}

Вывод:

ArrayList with duplicate elements: [1, 2, 3, 4, 1, 3]
ArrayList without duplicate elements: [1, 2, 3, 4]

В этом примере мы использовали класс Stream для удаления дубликатов из ArrayList:

  • numbers.stream() — создаёт поток из ArrayList;

  • stream.distinct() — удаляет дубликаты;

  • stream.collect(Collectors.toList()) — возвращает список из потока.

Здесь мы использовали приведение типов, чтобы преобразовать возвращённый List в ArrayList.