Javaでリストから重複するデータを削除する3つの方法

Javaでリストを操作する際、重複したデータを削除するケースは頻繁に発生します。この記事では、Javaでリストから重複するデータを効率的に削除する3つの主要な方法を紹介します。

HashSet または LinkedHashSet を使う方法

最もシンプルで一般的な方法は、HashSet または LinkedHashSet を利用する方法です。

HashSetの基本

HashSet は集合を表すデータ構造で、その性質上、重複したデータを持たないことが保証されています。これを利用して、リストのデータを一度HashSetに変換することで、自動的に重複が削除されます。

しかし、HashSetのもう一つの特性として、データの順序が保持されないことがあります。これは、特定の順序でデータを保持する必要がない場面で有用です。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> listWithDuplicates = new ArrayList<>();
        listWithDuplicates.add("A");
        listWithDuplicates.add("B");
        listWithDuplicates.add("A");
        listWithDuplicates.add("C");

        List<String> listWithoutDuplicates = new ArrayList<>(new HashSet<>(listWithDuplicates));

        System.out.println(listWithoutDuplicates); // [A, B, C] (順序は保障されません)
    }
}

LinkedHashSetとは

順序を保持しつつ重複を削除したい場合、LinkedHashSetを使用します。LinkedHashSetは、データの追加された順序を保持する特性があります。

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> listWithDuplicates = new ArrayList<>();
        listWithDuplicates.add("A");
        listWithDuplicates.add("B");
        listWithDuplicates.add("A");
        listWithDuplicates.add("C");

        List<String> listWithoutDuplicates = new ArrayList<>(new LinkedHashSet<>(listWithDuplicates));

        System.out.println(listWithoutDuplicates); // [A, B, C]
    }
}

Java 8 Stream APIを使う方法

Java 8から追加されたStream APIは、リストや他のコレクションのデータを柔軟に処理する強力なツールです。このAPIを利用して、簡潔かつ読みやすく重複を削除することもできます。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> listWithDuplicates = new ArrayList<>();
        listWithDuplicates.add("A");
        listWithDuplicates.add("B");
        listWithDuplicates.add("A");
        listWithDuplicates.add("C");

        List<String> listWithoutDuplicates = listWithDuplicates.stream()
                                                .distinct()
                                                .collect(Collectors.toList());

        System.out.println(listWithoutDuplicates); // [A, B, C]
    }
}

distinct() メソッドをストリームに適用することで、重複する要素をフィルタリングします。その後、collect()メソッドを使用して、フィルタリングされたデータを再びリストに変換します。

まとめ

Javaでリストの重複を削除する方法は複数存在し、ケースや要件に応じて適切な方法を選択することが重要です。HashSetやLinkedHashSetはシンプルで手早く実装できる一方、Stream APIは現代的なJavaのコーディングスタイルであるため、どのシチュエーションにも適しています。