Введение
В Java ArrayList может хранить дублирующиеся элементы. Если мы хотим удалить дубликаты и оставить только уникальные элементы, нам придется предпринять определенные шаги. В этом Лаборатории мы узнаем, как удалить дубликаты из ArrayList двумя способами: с использованием HashSet и с использованием метода distinct() для Stream.
Создать ArrayList
Создайте ArrayList и добавьте в него несколько элементов. Вот пример:
import java.util.ArrayList;
public class RemoveDuplicates {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(1);
arrayList.add(4);
arrayList.add(2);
System.out.println("Original ArrayList: " + arrayList);
}
}
Для запуска кода в терминале перейдите в каталог, содержащий файл, и введите следующую команду:
javac RemoveDuplicates.java && java RemoveDuplicates
Удалить дубликаты с использованием HashSet
Для удаления дубликатов с использованием HashSet сначала создайте HashSet и передайте ArrayList в его конструктор. Поскольку HashSet содержит только уникальные элементы, это устраняет все дубликаты. Преобразуйте полученный HashSet обратно в ArrayList.
import java.util.ArrayList;
import java.util.HashSet;
public class RemoveDuplicates {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(1);
arrayList.add(4);
arrayList.add(2);
System.out.println("Original ArrayList: " + arrayList);
// Remove duplicates
HashSet<Integer> hashSet = new HashSet<>(arrayList);
arrayList.clear();
arrayList.addAll(hashSet);
System.out.println("ArrayList with duplicates removed using HashSet: " + arrayList);
}
}
Удалить дубликаты с использованием метода distinct() для Stream
Для удаления дубликатов с использованием API Stream сначала используйте метод stream() для ArrayList, чтобы создать Stream. Затем используйте метод distinct(), чтобы вернуть новый поток с уникальными элементами. Наконец, используйте метод collect(), чтобы вернуть элементы потока в виде ArrayList.
import java.util.ArrayList;
public class RemoveDuplicates {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(1);
arrayList.add(4);
arrayList.add(2);
System.out.println("Original ArrayList: " + arrayList);
// Remove duplicates
arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
}
Протестировать оба подхода
Для проверки обоих подходов скомпилируйте и запустите оба примера кода в терминале.
javac RemoveDuplicates.java && java RemoveDuplicates
Создать функцию
Для того, чтобы было проще удалять дубликаты из нескольких ArrayList в нашей программе, мы можем создать функцию. Вот пример:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;
public class RemoveDuplicates {
public static void main(String[] args) {
ArrayList<Integer> arrayList1 = new ArrayList<>();
arrayList1.add(1);
arrayList1.add(2);
arrayList1.add(3);
arrayList1.add(1);
arrayList1.add(4);
arrayList1.add(2);
System.out.println("Original ArrayList: " + arrayList1);
ArrayList<Integer> arrayList2 = new ArrayList<>();
arrayList2.add(5);
arrayList2.add(6);
arrayList2.add(1);
arrayList2.add(7);
arrayList2.add(5);
System.out.println("Original ArrayList: " + arrayList2);
// Remove duplicates using HashSet
removeDuplicatesUsingHashSet(arrayList1);
removeDuplicatesUsingHashSet(arrayList2);
// Remove duplicates using Stream
removeDuplicatesUsingStream(arrayList1);
removeDuplicatesUsingStream(arrayList2);
}
public static void removeDuplicatesUsingHashSet(ArrayList<Integer> arrayList) {
HashSet<Integer> hashSet = new HashSet<>(arrayList);
arrayList.clear();
arrayList.addAll(hashSet);
System.out.println("ArrayList with duplicates removed using HashSet: " + arrayList);
}
public static void removeDuplicatesUsingStream(ArrayList<Integer> arrayList) {
arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
}
Компилировать и запускать
Для запуска кода в терминале перейдите в директорию, содержащую файл, и введите следующую команду:
javac RemoveDuplicates.java && java RemoveDuplicates
Изменить тип данных
Функция removeDuplicatesUsingHashSet() работает только для ArrayList<Integer>. Чтобы сделать функцию более гибкой, мы можем изменить тип данных на ArrayList<T>.
import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;
public class RemoveDuplicates<T> {
public static void main(String[] args) {
ArrayList<Integer> arrayList1 = new ArrayList<>();
arrayList1.add(1);
arrayList1.add(2);
arrayList1.add(3);
arrayList1.add(1);
arrayList1.add(4);
arrayList1.add(2);
System.out.println("Original ArrayList: " + arrayList1);
ArrayList<String> arrayList2 = new ArrayList<>();
arrayList2.add("Hello");
arrayList2.add("World");
arrayList2.add("Java");
arrayList2.add("Hello");
arrayList2.add("Mars");
System.out.println("Original ArrayList: " + arrayList2);
// Remove duplicates using HashSet
removeDuplicatesUsingHashSet(arrayList1);
removeDuplicatesUsingHashSet(arrayList2);
// Remove duplicates using Stream
removeDuplicatesUsingStream(arrayList1);
removeDuplicatesUsingStream(arrayList2);
}
public static <T> void removeDuplicatesUsingHashSet(ArrayList<T> arrayList) {
HashSet<T> hashSet = new HashSet<>(arrayList);
arrayList.clear();
arrayList.addAll(hashSet);
System.out.println("ArrayList with duplicates removed using HashSet: " + arrayList);
}
public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
}
Компилировать и запустить модифицированную версию
Для запуска кода в терминале перейдите в директорию, содержащую файл, и введите следующую команду:
javac RemoveDuplicates.java && java RemoveDuplicates
Добавить ввод пользователя
Для того, чтобы наша программа была более интерактивной, мы можем позволить пользователю вводить целые числа, которые он хочет добавить в ArrayList. Вот пример:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.stream.Collectors;
public class RemoveDuplicates<T> {
public static void main(String[] args) {
ArrayList<Integer> arrayList1 = new ArrayList<>();
int input = getUserInput();
while (input!= -1) {
arrayList1.add(input);
input = getUserInput();
}
System.out.println("Original ArrayList: " + arrayList1);
// Remove duplicates using HashSet
removeDuplicatesUsingHashSet(arrayList1);
// Remove duplicates using Stream
removeDuplicatesUsingStream(arrayList1);
}
public static <T> void removeDuplicatesUsingHashSet(ArrayList<T> arrayList) {
HashSet<T> hashSet = new HashSet<>(arrayList);
arrayList.clear();
arrayList.addAll(hashSet);
System.out.println("ArrayList with duplicates removed using HashSet: " + arrayList);
}
public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
public static int getUserInput() {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter an integer to add to the ArrayList, or -1 to quit: ");
if (scanner.hasNextInt()) {
return scanner.nextInt();
}
return -1;
}
}
Компилировать и запустить финальную версию
Для запуска кода в терминале перейдите в директорию, содержащую файл, и введите следующую команду:
javac RemoveDuplicates.java && java RemoveDuplicates
Резюме
В этом практическом занятии мы узнали, как удалить дубликаты из ArrayList двумя способами: с использованием HashSet и с использованием метода distinct() для Stream. Мы также создали функцию, чтобы упростить удаление дубликатов из нескольких ArrayList в нашей программе, изменили тип данных, чтобы сделать функцию более гибкой, и позволили пользователю вводить целые числа, которые он хочет добавить в ArrayList.



