Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでArrayListから重複要素を削除する方法【Set・Stream API活用】

JavaのSetインターフェースは、重複する要素を許容しないという特徴を持っています。このインターフェースのadd()メソッドは引数として受け取った要素をSetオブジェクトに追加し、追加が成功すればtrueを返します。一方、すでに存在する要素を追加しようとした場合、追加操作は失敗しfalseが返されます。この性質を利用することで、ArrayList内の重複要素を簡単に取り除くことができます。

Setを使って重複を削除する基本手順

ArrayListオブジェクトから冗長な要素を削除するには、以下の手順に従います。

  • 対象となるArrayListを作成(または取得)します。
  • 空のSetオブジェクトを作成します。
  • ArrayListのすべての要素をSetオブジェクトへ追加します(重複分は自動的に除外されます)。
  • clear()メソッドでArrayListの内容を空にします。
  • addAll()メソッドを使い、Setオブジェクトの内容を再びArrayListへ格納します。

サンプルコード

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class RemovingDuplicates {
    public static void main(String[] args){
       // ArrayListオブジェクトのインスタンス化
       ArrayList<String> list = new ArrayList<String>();
       list.add("JavaFX");
       list.add("Java");
       list.add("JavaFX");
       list.add("OpenCV");
       list.add("Java");
       list.add("JOGL");
       list.add("JOGL");
       list.add("HBase");
       list.add("Flume");
       list.add("HBase");
       list.add("Impala");
       System.out.println("Contents of the Array List : \n"+list);
       // ArrayListのIteratorオブジェクトを取得
       Iterator<String> it = list.iterator();
       // 空のSetオブジェクトを作成
       Set<String> set = new HashSet<String>();
       // ArrayListの要素をSetオブジェクトへ追加
       while(it.hasNext()) {
           set.add(it.next());
       }
       // ArrayListからすべての要素を削除
       list.clear();
       // Setの要素をリストへ戻す
       list.addAll(set);
       System.out.println("Contents of the Array List after removing duplicate elements: \n"+list);
    }
}

実行結果

Contents of the Array List :
[JavaFX, Java, JavaFX, OpenCV, Java, JOGL, JOGL, HBase, Flume, HBase, Impala]
Contents of the Array List after removing duplicate elements:
[JavaFX, Java, OpenCV, JOGL, Flume, Impala, HBase]

注意点:HashSetでは要素の順序が保持されない

HashSetは要素の順序を保証しないため、上記の出力例のように元の挿入順序とは異なる順番で表示される点に注意が必要です。もし元の順序を維持したい場合は、挿入順序を記憶するLinkedHashSetを使用しましょう。

Set<String> set = new LinkedHashSet<String>(list);
list.clear();
list.addAll(set);

代替手段:Stream APIのdistinct()メソッド

Java 8以降を使用している場合は、Stream APIのdistinct()メソッドを使うことで、より簡潔に重複を除去できます。こちらも元の順序が保持されるため、実務ではよく使われる手法です。

import java.util.stream.Collectors;

List<String> result = list.stream()
                        .distinct()
                        .collect(Collectors.toList());

状況に応じて、シンプルなHashSet方式、順序保持が必要ならLinkedHashSet方式、モダンな書き方を好むならStream API方式を選択するとよいでしょう。

  1. Pythonでリストからオブジェクトを削除する方法|remove・del・popの違いと使い分け

    Pythonでリストからオブジェクト(要素)を削除するには、主にremove()・del・pop()という3つの方法があります。それぞれ挙動が異なるため、目的に応じて使い分けることが重要です。 1. remove():値を指定して削除する remove()メソッドは、引数に指定した値に一致する最初の要素をリストから削除します。インデックスではなく値そのものを指定する点が特徴です。 使用例 a = [3, 2, 3, 2] a.remove(3) print(a) 実行結果 [2, 3, 2] この例では、最初に出現する「3」だけが削除され、2つ目の「3」はそのまま残ります。また、リスト

  2. JavaでArrayListから重複要素を削除する方法【SetとStream API】

    この記事では、JavaのArrayListから重複する要素を削除する方法を、具体的なコード例とともにわかりやすく解説します。代表的な2つのアプローチを紹介するので、目的や使用しているJavaのバージョンに応じて使い分けてください。 ArrayListから重複する文字列を削除する Setインターフェースには「重複した要素を保持できない」という特性があります。この特性を利用して、重複を含むArrayListを引数としてSetオブジェクトを生成すれば、手軽に重複を除去できます。 ポイントはLinkedHashSetを使うことです。通常のHashSetではなくLinkedHashSetを採用することで