Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法を学びます。この部分集合のチェックを行う便利な方法である containsAll() メソッドを調べます。

実践的な例を通じて、異なる集合型で containsAll() を使用する方法と、空集合や null 集合などのエッジケースを処理する方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/linkedlist("LinkedList") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashset("HashSet") subgraph Lab Skills java/arrays_methods -.-> lab-559974{{"Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法"}} java/collections_methods -.-> lab-559974{{"Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法"}} java/exceptions -.-> lab-559974{{"Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法"}} java/linkedlist -.-> lab-559974{{"Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法"}} java/hashset -.-> lab-559974{{"Java である集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法"}} end

containsAll() を使用した部分集合のチェック

このステップでは、Java の containsAll() メソッドを使用して、ある集合が別の集合の部分集合であるかどうかをチェックする方法を調べます。これはコレクションを扱う際の一般的な操作であり、containsAll() はこのチェックを行う便利な方法を提供します。

まず、~/project ディレクトリに SubsetCheck.java という名前の新しい Java ファイルを作成しましょう。左側のファイルエクスプローラーで右クリックして「新しいファイル」を選択し、SubsetCheck.java と入力することで作成できます。

次に、エディターで SubsetCheck.java ファイルを開き、以下のコードを追加します。

import java.util.HashSet;
import java.util.Set;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create the main set
        Set<Integer> mainSet = new HashSet<>();
        mainSet.add(1);
        mainSet.add(2);
        mainSet.add(3);
        mainSet.add(4);
        mainSet.add(5);

        // Create a potential subset
        Set<Integer> subset = new HashSet<>();
        subset.add(2);
        subset.add(4);

        // Check if 'subset' is a subset of 'mainSet'
        boolean isSubset = mainSet.containsAll(subset);

        // Print the result
        System.out.println("Main Set: " + mainSet);
        System.out.println("Subset: " + subset);
        System.out.println("Is 'subset' a subset of 'mainSet'? " + isSubset);
    }
}

コードを分解して説明しましょう。

  • import java.util.HashSet;import java.util.Set;:これらの行は、集合を扱うために必要なクラスをインポートします。
  • Set<Integer> mainSet = new HashSet<>();:これは整数値を格納する HashSet である mainSet を作成します。
  • mainSet.add(...):これらの行は mainSet に要素を追加します。
  • Set<Integer> subset = new HashSet<>();:これは別の HashSet である subset を作成します。
  • subset.add(...):これらの行は subset に要素を追加します。
  • boolean isSubset = mainSet.containsAll(subset);:これがこのステップの核心です。mainSetcontainsAll() メソッドが subset を引数として呼び出されます。mainSetsubset のすべての要素を含んでいる場合は true を返し、そうでない場合は false を返します。
  • System.out.println(...):これらの行は集合と部分集合のチェック結果をコンソールに出力します。

SubsetCheck.java ファイルを保存します(Ctrl+S または Cmd+S)。

次に、WebIDE の下部にあるターミナルを開きます。~/project ディレクトリにいることを確認してください。そうでない場合は、cd ~/project コマンドを使用して移動します。

javac コマンドを使用して Java コードをコンパイルします。

javac SubsetCheck.java

エラーがなければ、何も出力されないはずです。これはコンパイルが成功し、SubsetCheck.class ファイルが作成されたことを意味します。

最後に、java コマンドを使用してコンパイルされた Java プログラムを実行します。

java SubsetCheck

以下のような出力が表示されるはずです。

Main Set: [1, 2, 3, 4, 5]
Subset: [2, 4]
Is 'subset' a subset of 'mainSet'? true

この出力は、containsAll() メソッドが subset が実際に mainSet の部分集合であることを正しく識別したことを確認しています。

異なる集合型でのテスト

前のステップでは、containsAll() メソッドを説明するために HashSet を使用しました。Java では、Set インターフェースの異なる実装(HashSetLinkedHashSetTreeSet など)が提供されています。これらは内部構造や特性(順序など)が異なりますが、containsAll() メソッドはどれに対しても一貫して機能します。

このステップでは、SubsetCheck.java ファイルを変更して、異なる型の集合で containsAll() をテストします。

WebIDE のエディターで SubsetCheck.java ファイルを開きます。

既存のコードを以下のコードに置き換えます。

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create a main set using HashSet
        Set<Integer> hashMainSet = new HashSet<>();
        hashMainSet.add(10);
        hashMainSet.add(20);
        hashMainSet.add(30);
        hashMainSet.add(40);

        // Create a subset using LinkedHashSet
        Set<Integer> linkedSubset = new LinkedHashSet<>();
        linkedSubset.add(30);
        linkedSubset.add(10);

        // Create another subset using TreeSet
        Set<Integer> treeSubset = new TreeSet<>();
        treeSubset.add(40);
        treeSubset.add(20);

        // Check subset relationship using containsAll()
        boolean isLinkedSubset = hashMainSet.containsAll(linkedSubset);
        boolean isTreeSubset = hashMainSet.containsAll(treeSubset);

        // Create a subset that is NOT a subset
        Set<Integer> notSubset = new HashSet<>();
        notSubset.add(20);
        notSubset.add(50); // 50 is not in hashMainSet

        boolean isNotSubset = hashMainSet.containsAll(notSubset);


        // Print the results
        System.out.println("Hash Main Set: " + hashMainSet);
        System.out.println("Linked Subset: " + linkedSubset);
        System.out.println("Is Linked Subset a subset of Hash Main Set? " + isLinkedSubset);
        System.out.println("Tree Subset: " + treeSubset);
        System.out.println("Is Tree Subset a subset of Hash Main Set? " + isTreeSubset);
        System.out.println("Not Subset: " + notSubset);
        System.out.println("Is Not Subset a subset of Hash Main Set? " + isNotSubset);
    }
}

この更新されたコードでは、以下のことを行っています。

  • LinkedHashSetTreeSet をインポートしています。
  • HashSet を使用して hashMainSet を作成しています。
  • LinkedHashSet を使用して linkedSubset を、TreeSet を使用して treeSubset を作成しています。linkedSubset に追加された要素の順序は hashMainSet と異なりますが、containsAll() は依然として正しく機能します。TreeSet は要素を自動的にソートします。
  • containsAll()false を返すケースを示すために、notSubset も追加しています。

SubsetCheck.java ファイルを保存します。

次に、ターミナルで変更したコードをコンパイルします。

javac SubsetCheck.java

コンパイルが成功したら、プログラムを実行します。

java SubsetCheck

以下のような出力が表示されるはずです。

Hash Main Set: [40, 10, 20, 30]
Linked Subset: [30, 10]
Is Linked Subset a subset of Hash Main Set? true
Tree Subset: [20, 40]
Is Tree Subset a subset of Hash Main Set? true
Not Subset: [50, 20]
Is Not Subset a subset of Hash Main Set? false

これは、部分集合に使用される具体的な Set の実装に関係なく、メインの集合が部分集合のすべての要素を含んでいる限り、containsAll() が正しく機能することを示しています。

空集合と null 集合の扱い

この最後のステップでは、containsAll() メソッドが空集合と null 値を扱う際の動作を調べます。これらのエッジケースを理解することは、堅牢なコードを書くために重要です。

WebIDE のエディターで SubsetCheck.java ファイルを開きます。

既存のコードを以下のコードに置き換えます。

import java.util.HashSet;
import java.util.Set;

public class SubsetCheck {

    public static void main(String[] args) {
        Set<Integer> mainSet = new HashSet<>();
        mainSet.add(1);
        mainSet.add(2);
        mainSet.add(3);

        // Case 1: Checking with an empty set
        Set<Integer> emptySet = new HashSet<>();
        boolean isEmptySubset = mainSet.containsAll(emptySet);
        System.out.println("Main Set: " + mainSet);
        System.out.println("Empty Set: " + emptySet);
        System.out.println("Is Empty Set a subset of Main Set? " + isEmptySubset);

        System.out.println("---"); // Separator

        // Case 2: Checking if an empty set contains all elements of a non-empty set
        Set<Integer> anotherEmptySet = new HashSet<>();
        Set<Integer> nonEmptySet = new HashSet<>();
        nonEmptySet.add(1);
        boolean isEmptyContainingNonEmpty = anotherEmptySet.containsAll(nonEmptySet);
        System.out.println("Another Empty Set: " + anotherEmptySet);
        System.out.println("Non-Empty Set: " + nonEmptySet);
        System.out.println("Is Another Empty Set a subset of Non-Empty Set? " + isEmptyContainingNonEmpty);

        System.out.println("---"); // Separator

        // Case 3: Checking with a null set
        Set<Integer> nullSet = null;
        try {
            boolean isNullSubset = mainSet.containsAll(nullSet);
            System.out.println("Is Null Set a subset of Main Set? " + isNullSubset);
        } catch (NullPointerException e) {
            System.out.println("Checking with a null set resulted in a: " + e.getClass().getName());
        }
    }
}

新しい部分を見てみましょう。

  • ケース 1: 空集合でのチェックemptySet を作成し、mainSet がそのすべての要素を含んでいるかどうかをチェックします。空集合は、他の空集合を含むすべての集合の部分集合と見なされます。
  • ケース 2: 空集合が非空集合のすべての要素を含んでいるかどうかのチェックanotherEmptySetnonEmptySet のすべての要素を含んでいるかどうかをチェックします。空集合は要素 1 を含んでいないため、これは false になります。
  • ケース 3: null 集合でのチェックSet 変数を null に設定します。null 引数で containsAll() を呼び出そうとすると、NullPointerException が発生します。この予期される例外を適切に処理し、メッセージを出力するために try-catch ブロックを使用します。

SubsetCheck.java ファイルを保存します。

ターミナルでコードをコンパイルします。

javac SubsetCheck.java

コンパイルされたプログラムを実行します。

java SubsetCheck

以下のような出力が表示されるはずです。

Main Set: [1, 2, 3]
Empty Set: []
Is Empty Set a subset of Main Set? true
---
Another Empty Set: []
Non-Empty Set: [1]
Is Another Empty Set a subset of Non-Empty Set? false
---
Checking with a null set resulted in a: java.lang.NullPointerException

この出力は、containsAll() が空集合と null 集合を扱う際の動作を確認しています。

  • 空集合は常に他の集合の部分集合です(true)。
  • 非空集合は決して空集合の部分集合ではありません(false)。
  • containsAll()null を渡すと、NullPointerException が発生します。

これらのケースを理解することで、Java で集合を扱う際の潜在的なエラーを回避することができます。

まとめ

この実験では、Java で containsAll() メソッドを使用して、ある集合が別の集合のすべての要素を含んでいるかどうかをチェックする方法を学びました。まず、HashSet を使用した基本的な例を作成し、containsAll() の核心機能を説明しました。このメソッドは、潜在的な部分集合が実際により大きな集合に含まれているかどうかを簡単に判断する方法を提供します。

次に、異なる型の集合でこの機能をテストする方法を調べ、containsAll() が様々な Set の実装で一貫して機能することを理解しました。最後に、部分集合のチェックを行う際に空集合と null 集合を扱う際の重要な考慮事項に対処し、堅牢でエラーのないコードを確保しました。