Научитесь удалять повторяющиеся элементы из списка в 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.