ArrayList から重複を削除する

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Java では、ArrayList には重複した要素を格納できます。重複を削除して一意の要素のみを残すには、特定の手順を踏む必要があります。この実験では、HashSet を使用する方法と Streamdistinct() メソッドを使用する方法の 2 通りで ArrayList から重複を削除する方法を学びます。


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("元の 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("元の ArrayList: " + arrayList);

        // 重複を削除する
        HashSet<Integer> hashSet = new HashSet<>(arrayList);
        arrayList.clear();
        arrayList.addAll(hashSet);

        System.out.println("HashSet を使って重複が削除された ArrayList: " + arrayList);
    }
}

Stream の distinct() メソッドを使って重複を削除する

Stream API を使って重複を削除するには、まず ArrayList の stream() メソッドを使って 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("元の ArrayList: " + arrayList);

        // 重複を削除する
        arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());

        System.out.println("Stream を使って重複が削除された ArrayList: " + 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("元の 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("元の 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("HashSet を使って重複が削除された ArrayList: " + arrayList);
    }

    public static void removeDuplicatesUsingStream(ArrayList<Integer> arrayList) {
        arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("Stream を使って重複が削除された ArrayList: " + 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("元の 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("元の 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("HashSet を使って重複が削除された ArrayList: " + arrayList);
    }

    public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
        arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("Stream を使って重複が削除された ArrayList: " + 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("元の 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("HashSet を使って重複が削除された ArrayList: " + arrayList);
    }

    public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
        arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("Stream を使って重複が削除された ArrayList: " + arrayList);
    }

    public static int getUserInput() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("ArrayList に追加する整数を入力してください。終了するには -1 を入力してください: ");
        if (scanner.hasNextInt()) {
            return scanner.nextInt();
        }
        return -1;
    }
}

最終版をコンパイルして実行する

端末でコードを実行するには、ファイルが含まれているディレクトリに移動し、次のコマンドを入力します。

javac RemoveDuplicates.java && java RemoveDuplicates

まとめ

この実験では、HashSet を使う方法と Streamdistinct() メソッドを使う方法の2つで、ArrayList から重複を削除する方法を学びました。また、プログラム内の複数の ArrayList から重複を削除するのを簡単にするための関数を作成し、関数をより柔軟にするためにデータ型を変更し、ユーザーに ArrayList に追加したい整数を入力できるようにしました。