【Java】2つのSet(セット)の差集合を計算するプログラムの書き方
この記事では、Javaで2つのセット(Set)の差を計算する方法について解説します。
Setは重複する要素を格納できないコレクションであり、数学における「集合」という概念をモデル化したものです。Setインターフェースは、Collectionインターフェースから継承したメソッドのみで構成されており、そこに「重複要素を禁止する」という制約が追加されています。
2つのセットの差(A − B)とは、「Aに含まれているが、Bには含まれていない要素」だけで構成される集合のことです。JavaではremoveAll()メソッドを使うことで、この差集合を簡単に求めることができます。
以下に具体的な実行例を示します。
入力例:
1つ目のセット: [90, 75, 60, 45]
2つ目のセット: [90, 60]
期待される出力:
2つのセットの差し引き後:
[75, 45]
アルゴリズム
手順1 - 処理を開始する
手順2 - 必要な変数を宣言する
手順3 - 値を定義する
手順4 - 2つのSetを作成し、「add」メソッドで要素を追加する
手順5 - セットの内容をコンソールに表示する
手順6 - 「removeAll」メソッドを使って2つのセットの差を計算する
手順7 - 差集合の結果をコンソールに表示する
手順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(45);
input_set_1.add(60);
input_set_1.add(75);
input_set_1.add(90);
System.out.println("1つ目のセット: " + input_set_1);
Set<Integer> input_set_2 = new HashSet<>();
input_set_2.add(60);
input_set_2.add(90);
System.out.println("2つ目のセット: " + input_set_2);
input_set_1.removeAll(input_set_2);
System.out.println("\n2つのセットの差:\n" + input_set_1);
}
}出力:
必要なパッケージがインポートされました
1つ目のセット: [90, 75, 60, 45]
2つ目のセット: [90, 60]
2つのセットの差:
[75, 45]
例2:オブジェクト指向スタイルでメソッドに分割する場合
こちらの例では、処理を独立した静的メソッドにカプセル化することで、オブジェクト指向プログラミングの設計思想に沿った実装にしています。
import java.util.HashSet;
import java.util.Set;
public class Demo {
static void subtract(Set<Integer> input_set_1, Set<Integer> input_set_2){
input_set_1.removeAll(input_set_2);
System.out.println("\n2つのセットの差:\n" + input_set_1);
}
public static void main(String[] args) {
System.out.println("必要なパッケージがインポートされました");
Set<Integer> input_set_1 = new HashSet<>();
input_set_1.add(45);
input_set_1.add(60);
input_set_1.add(75);
input_set_1.add(90);
System.out.println("1つ目のセット: " + input_set_1);
Set<Integer> input_set_2 = new HashSet<>();
input_set_2.add(60);
input_set_2.add(90);
System.out.println("2つ目のセット: " + input_set_2);
subtract(input_set_1, input_set_2);
}
}出力:
必要なパッケージがインポートされました
1つ目のセット: [90, 75, 60, 45]
2つ目のセット: [90, 60]
2つのセットの差:
[75, 45]
補足:removeAllメソッド利用時のポイント
- 動作の仕組み:
removeAll(Collection c)は、呼び出し元のセットから、引数で渡したコレクションに含まれるすべての要素を削除します。戻り値はboolean型で、実際に要素が1つでも削除されればtrueを返します。 - 差集合は非対称: 「A − B」と「B − A」は一般に異なる結果になるため、どちらのセットから引くのかを意識して実装しましょう。
- 順序について:
HashSetは要素の順序を保証しません。挿入した順序を維持したい場合はLinkedHashSet、常にソートされた状態にしたい場合はTreeSetの利用を検討してください。 - 元のセットを保持したい場合: 元のセットを変更せずに差集合を求めたいときは、事前にコピーを作成してから
removeAllを実行するか、Stream APIのfilterと組み合わせるのがおすすめです。
-
JavaにおけるListとSetの違いを徹底解説
ListとSetは、どちらもJavaのCollectionフレームワークに属するインターフェースであり、双方ともCollectionインターフェースを継承しています。これらは、複数のオブジェクトをひとつのまとまった単位として格納・管理するために使用されます。JDK 1.2以前のJavaでは、オブジェクトをグループ化するために配列(Array)、Vector、Hashtableなどが利用されていました。JDK 1.2でCollectionフレームワークが導入されて以降、ListやSetといったインターフェースがオブジェクト管理の標準的な手段となっています。本記事では、ListとSetの主な違いを
-
JavaのJSliderでエクステント(extent)を設定する方法
SwingのJSliderでは、スライダーのエクステント(extent)を設定するためにsetExtent()メソッドを使用します。エクステントとは、スライダーのつまみ(ノブ)がカバーする範囲のサイズのことで、この値を設定すると、ユーザーはスライダーをその範囲以上に移動できなくなります。setExtent()メソッドの基本的な使い方以下のように、JSliderオブジェクトに対してsetExtent()メソッドを呼び出すだけで、エクステントを設定できます。JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 70); slider.se