【Java入門】2つのArrayListから共通の要素を抽出する方法(retainAll活用)
本記事では、Javaを使って2つのArrayListから共通の要素を見つける方法を解説します。ArrayListクラスはAbstractListクラスを継承し、Listインターフェースを実装しています。ArrayListは必要に応じて自動的にサイズが拡張される動的な配列をサポートしており、柔軟なデータ管理が可能です。
ArrayListは初期サイズを指定して生成されます。要素数がそのサイズを超えるとコレクションは自動的に拡張され、逆にオブジェクトを削除した場合には配列が縮小されることもあります。
入力と出力のイメージ
今回扱う処理は、以下のような動作になります。
入力(想定):
1つ目のリスト: [Java, Scala, Shell, JavaScript] 2つ目のリスト: [Java, Python, Shell]
出力(期待値):
2つのリストの共通要素: [Java, Shell]
アルゴリズム
共通要素の抽出は、以下の手順で行います。
Step 1 - 処理を開始する Step 2 - input_list_1 と input_list_2 の2つのArrayListを宣言する Step 3 - 各リストに値を追加する Step 4 - 組み込みメソッド retainAll() を使って、両方のリストに存在する共通要素のみを残す Step 5 - 結果を表示する Step 6 - 処理を終了する
例1:mainメソッド内で完結させる書き方
まずは、すべての操作を「main」メソッド内にまとめて記述するシンプルな例です。
import java.util.ArrayList;
public class Demo {
public static void main(String[] args){
ArrayList<String>
input_list_1 = new ArrayList<String>();
input_list_1.add("Java");
input_list_1.add("Scala");
input_list_1.add("Shell");
input_list_1.add("JavaScript");
System.out.println("1つ目のリスト: " + input_list_1);
ArrayList<String> input_list_2 = new ArrayList<String>();
input_list_2.add("Java");
input_list_2.add("Python");
input_list_2.add("Shell");
System.out.println("2つ目のリスト: " + input_list_2);
input_list_1.retainAll(input_list_2);
System.out.println("
2つのリストの共通要素: " + input_list_1);
}
}実行結果
1つ目のリスト: [Java, Scala, Shell, JavaScript] 2つ目のリスト: [Java, Python, Shell] 2つのリストの共通要素: [Java, Shell]
例2:メソッドにカプセル化する書き方(オブジェクト指向)
次に、共通要素を取得する処理を独立したメソッドとして切り出し、オブジェクト指向プログラミングの考え方に沿って構造化した例を紹介します。処理を再利用したい場合や、コードの可読性を高めたい場合に有効です。
import java.util.ArrayList;
public class Demo {
static void get_common_elements(ArrayList<String> input_list_1, ArrayList<String> input_list_2){
input_list_1.retainAll(input_list_2);
System.out.println("
2つのリストの共通要素: " + input_list_1);
}
public static void main(String[] args){
ArrayList<String> input_list_1 = new ArrayList<String>();
input_list_1.add("Java");
input_list_1.add("Scala");
input_list_1.add("Shell");
input_list_1.add("JavaScript");
System.out.println("1つ目のリスト: " + input_list_1);
ArrayList<String> input_list_2 = new ArrayList<String>();
input_list_2.add("Java");
input_list_2.add("Python");
input_list_2.add("Shell");
System.out.println("2つ目のリスト: " + input_list_2);
get_common_elements(input_list_1, input_list_2);
}
}実行結果
1つ目のリスト: [Java, Scala, Shell, JavaScript] 2つ目のリスト: [Java, Python, Shell] 2つのリストの共通要素: [Java, Shell]
retainAll()メソッドのポイント
共通要素の抽出に使用している retainAll() は、Collectionインターフェースに定義されたメソッドで、引数に渡されたコレクションに含まれる要素だけを呼び出し元のリストに残します。利用する際には以下の点に注意しましょう。
- 元のリストが変更される: retainAll()は破壊的なメソッドのため、呼び出し元のリスト自体が書き換えられます。元のデータを保持したい場合は、事前にコピーを作成しておくのが安全です。
- null要素の扱い: 引数のリストにnullが含まれる場合、リスト側がnullを許容していないとNullPointerExceptionが発生することがあります。
- 戻り値の意味: 戻り値はboolean型で、「リストが実際に変更されたかどうか」を表します。共通要素の有無を判定する用途には向いていません。
このように、retainAll()を活用すればわずか1行のコードで2つのArrayListの共通要素を簡単に抽出できます。ぜひ実際の開発でも活用してみてください。
-
正方形の面積を求めるJavaプログラムの書き方【初心者向け解説】
この記事では、Javaを使って正方形の面積を求める方法をわかりやすく解説します。正方形の面積は、次の公式で計算できます。辺 × 辺つまり s2正方形の面積の計算式正方形の1辺の長さを s とすると、その面積は s2(辺の2乗)で表されます。下図のように、縦と横が同じ長さの図形であるため、辺同士を掛け合わせるだけで面積が求まります。入力例1辺の長さ : 4出力例正方形の面積 : 16アルゴリズム処理の流れは以下の手順になります。Step 1 - 開始Step 2 - 整数型の変数 my_side(辺の長さ)と my_area(面積)を宣言するStep 3 - ユーザーから値を読み込む、または値を
-
Pythonで二分木の最小共通祖先(LCA)を求めるアルゴリズムと実装例
はじめに二分木と2つの数値 a、b が与えられたとき、a と b を子孫として持つ最も深いノード(最小共通祖先:LCA)の値を求める問題を考えてみましょう。ここで重要なポイントは、「あるノードはそれ自身の子孫にもなり得る」という点です。つまり、片方のノードがもう片方の祖先である場合、そのノード自体が答えになります。例以下のような二分木を考えます。このとき、a = 6、b = 2 とすると、出力は 4 になります。値4のノードが、6と2の両方を子孫として持つ最も深いノードだからです。解法のアプローチこの問題は再帰を使って効率的に解くことができます。手順は以下の通りです。solve() メソッドを