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

JavaBeginner
Практиковаться сейчас

Введение

В 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.