ArrayList から重複を削除する

JavaBeginner
オンラインで実践に進む

はじめに

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

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 に追加したい整数を入力できるようにしました。