Перейти к содержимому

Как удалить из 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 Stream distinct() для удаления дубликатов

Метод Java Stream distinct()возвращает новый поток различных элементов. Поэтому его можно использовать для удаления дубликатов элементов из набора.

Обновлено: 2023-06-14 19:48:29 Вадим Дворников автор материала

Особенности использования метода distinct()

  • Элементы сравниваются с использованием equals(). Поэтому необходимо, чтобы элементы потока использовали правильную реализацию этого метода.
  • Если поток упорядочен, порядок нумерации сохраняется.
  • Если поток не упорядочен, то элементы потока могут иметь любой порядок.
  • Stream distinct() — промежуточная операция с состоянием.
  • Использование Different() с упорядоченным параллельным потоком может иметь низкую производительность из-за значительных расходов на буферизацию. В этом случае перейдите к последовательной обработке потока.

Удаление дублирующихся элементов с помощью distinct()

Рассмотрим, как использовать метод distinct()для удаления дубликатов из набора.

jshell> List list = List.of(1, 2, 3, 4, 3, 2, 1); list ==> [1, 2, 3, 4, 3, 2, 1] jshell> List distinctInts = list.stream().distinct().collect(Collectors.toList()); distinctInts ==> [1, 2, 3, 4]

Пример Java Stream distinct()

Обработка только уникальных элементов с использованием Stream distinct()и forEach()

Поскольку distinct() является промежуточной операцией, то мы можем использовать forEach() для обработки только уникальных элементов.

jshell> List list = List.of(1, 2, 3, 4, 3, 2, 1); list ==> [1, 2, 3, 4, 3, 2, 1] jshell> list.stream().distinct().forEach(x -> System.out.println("Processing " + x)); Processing 1 Processing 2 Processing 3 Processing 4

Пример Java Stream distinct() forEach()

Применение Stream distinct() к набору пользовательских объектов

Рассмотрим простой пример использования distinct() для удаления повторяющихся элементов из списка.

package com.journaldev.java; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class JavaStreamDistinct < public static void main(String[] args) < ListdataList = new ArrayList<>(); dataList.add(new Data(10)); dataList.add(new Data(20)); dataList.add(new Data(10)); dataList.add(new Data(20)); System.out.println("Data List = "+dataList); List uniqueDataList = dataList.stream().distinct().collect(Collectors.toList()); System.out.println("Unique Data List = "+uniqueDataList); > > class Data < private int id; Data(int i) < this.setId(i); >public int getId() < return id; >public void setId(int id) < this.id = id; >@Override public String toString() < return String.format("Data[%d]", this.id); >>
Data List = [Data[10], Data[20], Data[10], Data[20]] Unique Data List = [Data[10], Data[20], Data[10], Data[20]]

distinct() не удалил дублирующиеся элементы, потому что мы не реализовали метод equals() в классе Data. Метод Object equals() суперкласса был использован для идентификации равных элементов. Реализация метода класса equals() приведена ниже:

public boolean equals(Object obj)

Поскольку объекты Date() имели одинаковые идентификаторы, но ссылались на разные объекты, они считались не равными. Вот почему важно реализовать метод equals(), если вы планируете использовать distinct() при работе с пользовательскими объектами.

Обратите внимание на то, что методы equals() и hashCode() используются классами Collection API для сравнения объектов. Так что лучше обеспечить реализацию для них обоих.

@Override public int hashCode() < final int prime = 31; int result = 1; result = prime * result + id; return result; >@Override public boolean equals(Object obj)

Совет : Вы можете сгенерировать метод equals() и hashCode(), используя меню Eclipse: пункт Source> Generate equals() and hashCode().

Результирующий вывод после добавления реализации equals() и hashCode():

Data List = [Data[10], Data[20], Data[10], Data[20]] Data equals method Data equals method Unique Data List = [Data[10], Data[20

Удаление повторяющихся элементов из 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. Выбор конкретного метода зависит от конкретных условий и требований к коду.

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

В Java объект Set не допускает дублирование элементов, поэтому вы можете удалить дубликаты из ArrayList, создав объект set путем передачи требуемого объекта List его конструктору.

Пример

import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.Set; public class ArrayListSample < public static void main(String[] args)< ArrayListlist = new ArrayList(); list.add("JavaFx"); list.add("Java"); list.add("WebGL"); list.add("OpenCV"); Set set = new LinkedHashSet(list); System.out.println(set); > >

Итог

[JavaFx, Java, WebGL, OpenCV]

Средняя оценка 3 / 5. Количество голосов: 3

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

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

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