从 ArrayList 中移除重复项

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在 Java 中,ArrayList 可以存储重复的元素。如果我们想要移除重复项并只保留唯一的元素,我们需要采取特定的步骤。在这个实验中,我们将学习如何通过两种方式从 ArrayList 中移除重复项:使用 HashSet 和使用 Streamdistinct() 方法。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("`Java`")) -.-> java/DataStructuresGroup(["`Data Structures`"]) java(("`Java`")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["`Object-Oriented and Advanced Concepts`"]) java(("`Java`")) -.-> java/FileandIOManagementGroup(["`File and I/O Management`"]) java(("`Java`")) -.-> java/ConcurrentandNetworkProgrammingGroup(["`Concurrent and Network Programming`"]) java/DataStructuresGroup -.-> java/arrays("`Arrays`") java/DataStructuresGroup -.-> java/collections_methods("`Collections Methods`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("`Classes/Objects`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("`User Input`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/arraylist("`ArrayList`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashset("`HashSet`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/generics("`Generics`") java/FileandIOManagementGroup -.-> java/stream("`Stream`") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("`Working`") subgraph Lab Skills java/arrays -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/collections_methods -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/classes_objects -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/user_input -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/arraylist -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/hashset -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/generics -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/stream -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} java/working -.-> lab-117445{{"`从 ArrayList 中移除重复项`"}} end

创建一个 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);
    }
}

使用 Streamdistinct() 方法移除重复项

要使用 Stream API 移除重复项,首先使用 ArrayListstream() 方法创建一个 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);

        // 使用 HashSet 移除重复项
        removeDuplicatesUsingHashSet(arrayList1);
        removeDuplicatesUsingHashSet(arrayList2);

        // 使用 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);

        // 使用 HashSet 移除重复项
        removeDuplicatesUsingHashSet(arrayList1);
        removeDuplicatesUsingHashSet(arrayList2);

        // 使用 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);

        // 使用 HashSet 移除重复项
        removeDuplicatesUsingHashSet(arrayList1);

        // 使用 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 和使用 Streamdistinct() 方法。我们还创建了一个函数,以便更轻松地从程序中的多个 ArrayList 中移除重复项,修改了数据类型以使函数更加灵活,并允许用户输入他们想要添加到 ArrayList 的整数。

您可能感兴趣的其他 Java 教程