Удаление дубликатов из списка или ArrayList в Java

Научитесь удалять повторяющиеся элементы из списка в Java с помощью API Collection.removeIf(), HashSet, LinkedHashSet и Stream.

В этой таблице сравниваются различные подходы и их преимущества.

Метод Преимущество Код
HashSet Самый простой подход HashSet hashSet = new HashSet<>(originalList);
ArrayList listWithoutDuplicates = new ArrayList<>(hashSet);
LinkedHashSet Сохраняет порядок элементов LinkedHashSet hashSet = new LinkedHashSet<>(originalList);
ArrayList listWithoutDuplicates = new ArrayList<>(hashSet);
Коллекция.removeIf() Изменяет исходную коллекцию Set set = new HashSet<>(originalList.size());
оригинальныйСписок.removeIf(p -> !set.add(p));
Поток.отличительный() Возможность объединения других операций в цепочку Список списокБезДубликатов = оригинальныйСписок.поток().отличительный().собрать(Коллекторы.вСписок());

1. Использование Collection.removeIf() для удаления дубликатов из исходного списка

Метод removeIf() удаляет все элементы этой коллекции, которые удовлетворяют указанному Predicate. Каждый соответствующий элемент удаляется с помощью Iterator.remove(). Если итератор коллекции не поддерживает удаление, то для первого соответствующего элемента будет выдано исключение UnsupportedOperationException.

В следующем коде предикат добавляет текущий элемент в HashSet. Поскольку HashSet не допускает дублирования элементов, метод add() возвращает для них false. Все такие дублирующие элементы удаляются из списка, и, наконец, список содержит только уникальные элементы.

List<Integer> items = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));Set<Integer> set = new HashSet<>(items.size());items.removeIf(p -> !set.add(p));System.out.println(items); //[1, 2, 3, 4, 5, 6, 7, 8]

Обратите внимание, что этот метод изменяет элементы исходного списка, а не создает новый список.

2. Использование Stream.distinct() для удаления дубликатов элементов и получения нового списка

Мы можем использовать метод Java 8 Stream.distinct(), который возвращает поток, состоящий из отдельных элементов, сравненных методом equals() объекта. Наконец, соберите все элементы округа как список с помощью Collectors.toList().

ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));List<Integer> listWithoutDuplicates = numbersList.stream().distinct().collect(Collectors.toList());System.out.println(listWithoutDuplicates); //[1, 2, 3, 4, 5, 6, 7, 8]

Этот метод не изменяет исходный список и возвращает новый список.

3. Использование LinkedHashSet для удаления дубликатов и поддержания порядка

LinkedHashSet — еще один хороший подход к удалению дубликатов элементов в ArrayList. LinkedHashSet выполняет две внутренние функции:

  • Удалить дубликаты элементов
  • Сохраняйте порядок добавленных к нему элементов.

В данном примере элементы в ArrayList содержат целые числа; некоторые из них являются повторяющимися числами, например 1, 3 и 5. Мы добавляем список в LinkedHashSet, а затем возвращаем содержимое обратно в список. Результирующий arraylist не содержит повторяющихся целых чисел.

ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));LinkedHashSet<Integer> hashSet = new LinkedHashSet<>(items);ArrayList<Integer> listWithoutDuplicates = new ArrayList<>(hashSet);System.out.println(listWithoutDuplicates); //[1, 2, 3, 4, 5, 6, 7, 8]

Напишите мне ваши вопросы, связанные с тем, как удалить дубликаты объектов в arraylist в Java.

Исходный код на Github

Прокрутить вверх