JavaでArrayListから重複要素を削除する方法を解説
本記事では、JavaのArrayListから重複要素を削除する方法について詳しく解説します。ArrayListクラスはjava.utilパッケージに含まれる可変長配列(サイズを動的に変更できる配列)です。通常の組み込み配列との最大の違いは、配列のサイズは後から変更できないのに対し、ArrayListは要素の追加・削除によってサイズを柔軟に変えられる点にあります。
ただし、ArrayListには同じ値が複数含まれることがあり、データの前処理や集計の際に重複を取り除きたい場面は少なくありません。ここでは、LinkedHashSetを利用した定番の手法を中心に、具体的なサンプルコードと実行結果とともに紹介します。
重複削除のデモ
まず、どのような処理を行うのかを確認しましょう。次の入力リストから重複する要素を取り除きます。
入力:
入力リスト : [150, 250, 300, 250, 500, 150, 600, 750, 300]
期待される出力:
重複が除去されたリスト: [150, 250, 300, 500, 600, 750]
アルゴリズム
重複削除の基本的な流れは以下の通りです。
ステップ1 - 処理を開始する ステップ2 - 必要な変数を宣言する ステップ3 - 値を定義する ステップ4 - 整数型のArrayListを作成し、要素で初期化する ステップ5 - ArrayListの内容をコンソールに表示する ステップ6 - 整数型のLinkedHashSetを作成する ステップ7 - addAllメソッドを使い、元のArrayListの要素をセットに追加する ステップ8 - セットは重複を許さないため、ユニークな値だけが保持される ステップ9 - ArrayListの要素をクリアする ステップ10 - ユニークな要素を持つセットの内容をコンソールに表示する ステップ11 - 処理を終了する
ポイントは、Setインターフェースの実装クラスであるLinkedHashSetを使うことです。HashSetと異なり、LinkedHashSetは要素が追加された順序を保持するため、重複を除去しながら元のリストの並び順を維持できます。
例1:mainメソッド内ですべての処理を記述する
最初の例では、すべての操作をmainメソッドの中にまとめて記述します。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
System.out.println("必要なパッケージがインポートされました");
ArrayList<Integer> input_list = new ArrayList<>(Arrays.asList(150, 250, 300, 250, 500, 150, 600, 750, 300));
System.out.println("リストの定義: " + input_list);
Set<Integer> temp_set = new LinkedHashSet<>();
temp_set.addAll(input_list);
input_list.clear();
input_list.addAll(temp_set);
System.out.println("\n重複が除去されたリスト: \n" + input_list);
}
}実行結果
必要なパッケージがインポートされました リストの定義: [150, 250, 300, 250, 500, 150, 600, 750, 300] 重複が除去されたリスト: [150, 250, 300, 500, 600, 750]
例2:オブジェクト指向スタイルでメソッドに分割する
次の例では、重複削除の処理を独立したstaticメソッドとしてカプセル化し、オブジェクト指向プログラミングらしい構造にしています。処理をメソッドに切り出すことで、コードの再利用性と可読性が向上します。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class Demo {
static void remove_duplicates(ArrayList<Integer> input_list){
Set<Integer> temp_set = new LinkedHashSet<>();
temp_set.addAll(input_list);
input_list.clear();
input_list.addAll(temp_set);
System.out.println("\n重複が除去されたリスト: \n" + input_list);
}
public static void main(String[] args) {
System.out.println("必要なパッケージがインポートされました");
ArrayList<Integer> input_list = new ArrayList<>(Arrays.asList(150, 250, 300, 250, 500, 150, 600, 750, 300));
System.out.println("リストの定義: " + input_list);
remove_duplicates(input_list);
}
}実行結果
必要なパッケージがインポートされました リストの定義: [150, 250, 300, 250, 500, 150, 600, 750, 300] 重複が除去されたリスト: [150, 250, 300, 500, 600, 750]
補足:Stream APIを使ったより簡潔な方法(Java 8以降)
Java 8以降を使用している場合は、Stream APIのdistinct()メソッドを利用すると、わずか数行で重複を除去できます。この方法も要素の出現順を保持するため、LinkedHashSetと同様の結果が得られます。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Demo {
public static void main(String[] args) {
List<Integer> input_list = new ArrayList<>(Arrays.asList(150, 250, 300, 250, 500, 150, 600, 750, 300));
System.out.println("リストの定義: " + input_list);
List<Integer> result = input_list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println("\n重複が除去されたリスト: \n" + result);
}
}実行結果
リストの定義: [150, 250, 300, 250, 500, 150, 600, 750, 300] 重複が除去されたリスト: [150, 250, 300, 500, 600, 750]
まとめ
ArrayListから重複要素を削除するには、元の順序を保持したい場合はLinkedHashSet、コードの簡潔さを重視するならStream APIのdistinct()が便利です。それぞれの特徴を理解し、用途に応じて使い分けることで、効率的かつ読みやすいコードを実現できます。
-
Pythonで循環リンクリストから重複要素を削除する方法【コード例付き】
循環リンクリストから重複要素を削除したい場合は、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータと、リンクリストにおける次のノードへの参照という2つの属性を持たせます。循環リンクリストでは、先頭(head)と末尾(tail)が互いに隣接しています。両者が連結されることで円形構造が形成され、最後のノードに「NULL」は存在しません。次に、初期化関数を持つ別のクラスを作成し、headノードを「None」で初期化します。その上で、ノードをリンクリストへ追加するメソッド、重複を削除するメソッド、そしてノードの値を表示するメソッドといった複数のメソッドを定義していき
-
JavaでArrayListから重複要素を削除する方法【SetとStream API】
この記事では、JavaのArrayListから重複する要素を削除する方法を、具体的なコード例とともにわかりやすく解説します。代表的な2つのアプローチを紹介するので、目的や使用しているJavaのバージョンに応じて使い分けてください。 ArrayListから重複する文字列を削除する Setインターフェースには「重複した要素を保持できない」という特性があります。この特性を利用して、重複を含むArrayListを引数としてSetオブジェクトを生成すれば、手軽に重複を除去できます。 ポイントはLinkedHashSetを使うことです。通常のHashSetではなくLinkedHashSetを採用することで