Javaで2つのSetの積集合(共通部分)を計算するプログラム
この記事では、2つのSet(集合)の積集合、つまり共通部分を計算する方法について詳しく解説します。
Setとは、重複する要素を含むことができないCollectionであり、数学における「集合」の概念をモデル化したものです。SetインターフェースにはCollectionから継承されたメソッドのみが定義されており、そこに「重複要素を許可しない」という制約が加えられています。
2つのSetの積集合を求める際に活躍するのがretainAllメソッドです。このメソッドは、引数に渡したコレクションに含まれる要素だけを保持し、それ以外の要素を呼び出し元のSetから削除します。その結果、両方のSetに共通して存在する要素のみが残ります。
処理の流れ
以下に、具体的な入力と出力の例を示します。
入力値:
最初のSet: [40, 45] 2番目のSet: [50, 45]
期待される出力:
2つのSetの積集合: [45]
アルゴリズムの手順
ステップ1 - 処理を開始する ステップ2 - 必要な変数を宣言する ステップ3 - 値を定義する ステップ4 - 2つのSetを作成し、「add」メソッドで要素を追加する ステップ5 - Setの内容をコンソールに表示する ステップ6 - 「retainAll」メソッドを使って積集合を計算する ステップ7 - 積集合(両方のSetに共通する一意な要素)をコンソールに表示する ステップ8 - 処理を終了する
例1:mainメソッド内ですべての処理を行う場合
この例では、すべての操作をmainメソッド内にまとめて記述します。シンプルなスクリプト的な書き方で、処理の流れが把握しやすいのが特徴です。
import java.util.HashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
System.out.println("必要なパッケージをインポートしました");
Set<Integer> input_set_1 = new HashSet<>();
input_set_1.add(40);
input_set_1.add(45);
System.out.println("最初のSet: " + input_set_1);
Set<Integer> input_set_2 = new HashSet<>();
input_set_2.add(45);
input_set_2.add(50);
System.out.println("2番目のSet: " + input_set_2);
input_set_2.retainAll(input_set_1);
System.out.println("\n2つのSetの積集合: " + input_set_2);
}
}
実行結果
必要なパッケージをインポートしました 最初のSet: [40, 45] 2番目のSet: [50, 45] 2つのSetの積集合: [45]
例2:オブジェクト指向スタイルで関数にカプセル化する場合
この例では、積集合を求める処理を独立したメソッドとして切り出し、オブジェクト指向プログラミングの考え方に沿って構造化しています。処理を再利用したい場合や、コードの保守性を高めたい場合に有効なアプローチです。
import java.util.HashSet;
import java.util.Set;
public class Demo {
static void set_intersection(Set<Integer> input_set_1, Set<Integer> input_set_2){
input_set_2.retainAll(input_set_1);
System.out.println("\n2つのSetの積集合: " + input_set_2);
}
public static void main(String[] args) {
System.out.println("必要なパッケージをインポートしました");
Set<Integer> input_set_1 = new HashSet<>();
input_set_1.add(40);
input_set_1.add(45);
System.out.println("最初のSet: " + input_set_1);
Set<Integer> input_set_2 = new HashSet<>();
input_set_2.add(45);
input_set_2.add(50);
System.out.println("2番目のSet: " + input_set_2);
set_intersection(input_set_1, input_set_2);
}
}
実行結果
必要なパッケージをインポートしました 最初のSet: [40, 45] 2番目のSet: [50, 45] 2つのSetの積集合: [45]
まとめ
Javaで2つのSetの積集合を求めるには、retainAllメソッドを使うのが最も簡単です。片方のSetに対してもう片方のSetを引数としてretainAllを呼び出すだけで、共通する要素だけが残ります。なお、retainAllは呼び出し元のSet自体を変更する(破壊的メソッドである)点に注意してください。元のSetを保持しておきたい場合は、事前にコピーを作成しておくと安全です。
-
Javaで2つの連結リストの交点を見つける方法
連結リスト(Linked List)は、各ノードが2つのブロックで構成される線形データ構造です。一方のブロックにはノードの値(データ)が格納され、もう一方のブロックには次のノードへのアドレス(ポインタ)が格納されます。ここでは、2つの連結リストが交差するノードを見つける問題を扱います。2つのリストが共通のノードを持つ場合、その交点となるノードを特定します。交点が存在しない場合は、NULL(または空)を出力として返します。具体例入力1:出力:2説明: 与えられた連結リストは値「2」のノードで交差しているため、出力として「2」を返します。入力2:出力:NULL説明: 共通のノードが存在しないため、
-
JavaのJSliderでエクステント(extent)を設定する方法
SwingのJSliderでは、スライダーのエクステント(extent)を設定するためにsetExtent()メソッドを使用します。エクステントとは、スライダーのつまみ(ノブ)がカバーする範囲のサイズのことで、この値を設定すると、ユーザーはスライダーをその範囲以上に移動できなくなります。setExtent()メソッドの基本的な使い方以下のように、JSliderオブジェクトに対してsetExtent()メソッドを呼び出すだけで、エクステントを設定できます。JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 70); slider.se