Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

Set

このページではコレクション・フレームワークの内、Setインタフェースについて説明します。

Setの概要

Setインタフェースは重複要素を持たないオブジェクトの集合を実装します。Setインタフェースを実装するクラスとしてHashSet、TreeSet、LinkedSetが定義されています。

HashSetクラス
Setインタフェースを実装した基本となるクラスです。保持する要素内において重複要素を持ちません。保持する要素の順序を保証しません。Setインタフェースを実装したクラス内では最も高速に動作します。
TreeSetクラス
保持する要素内において重複要素を持ちません。また、保持する要素は要素の自然順序、もしくはコンストラクタに指定されたComparatorに従って昇順にソートされます。
LinkedHashSetクラス
保持する要素内において重複要素を持ちません。また、要素の挿入される挿入順を保持します。

【例1】各クラスに要素を挿入し、各クラスの特性を表す例です。

import java.util.*;

public class ExCollection5 {
    public static void main(String[] args) {
        ExCollection5 exObject = new ExCollection5();
        exObject.showFeature(new HashSet(), "HashSet");  //(1)
        exObject.showFeature(new TreeSet(), "TreeSet");  //(2)
        exObject.showFeature(new LinkedHashSet(), "LinkedHashSet");  //(3)
    }

    //(4)Setインタフェース型を引数に取る
    void showFeature(Set exSet, String s) {
        int[] intArray = {5, 8, 2, 9, 1};  //(5)代入する要素の配列
        //(6)各クラスに要素を代入
        for(int i = 0; i < intArray.length; i++) {
            exSet.add(new Integer(intArray[i]));
        }
        //(7)各クラスの要素を表示
        System.out.println(s + " = " + exSet);
    }
}

解説1

  1. (1)引数にHashSetオブジェクトと、キーワード”HashSet”を引数に取り、メソッドshowFeatureを呼び出します。
  2. (2)引数にTreeSetオブジェクトと、キーワード”TreeSet”を引数に取り、メソッドshowFeatureを呼び出します。
  3. (3)引数にLinkedHashSetオブジェクトと、キーワード”LinkedHashSet”を引数に取り、メソッドshowFeatureを呼び出します。
  4. (4)showFeatureメソッドでは、引数にSetインタフェース型変数exSetを取っています。インタフェース型の変数はそのインタフェースを実装したオブジェクトを代入することができます。これは、HashSetクラス、TreeSetクラス、LinkedHashSetクラスごとにshowFeatureメソッドを用意する必要がないことを表します。
  5. (5)各クラスのオブジェクトに代入する要素の配列を生成します。
  6. (6)forループを使用し、配列内の要素を各オブジェクトに代入します。
  7. (7)クラスの要素の状態を表示します。

実行結果1

D:\JAVA>javac ExCollection5.java

D:\JAVA>java ExCollection5
#HashSetの特性は要素の順序を保持しないことです。要素追加順{5, 8, 2, 9, 1}に対して、ランダムに表示されます。
HashSet = [2, 9, 8, 1, 5]

#TreeSetの特性は要素を昇順にソートすることです。追加された要素{5, 8, 2, 9, 1}に対して、昇順にソートされています。
TreeSet = [1, 2, 5, 8, 9]

#LinkedHasSetの特性は要素の挿入順を維持することです。要素{5, 8, 2, 9, 1}に対して、挿入順を維持しています。
LinkedHashSet = [5, 8, 2, 9, 1]

D:\JAVA>

Setのコンストラクタ

HashSetクラスのコンストラクタ

コンストラクタ 説明
HashSet( ) 初期容量(16)、負荷係数(0.75)の空のHashSetを作成します。
HashSet(Collection) 引数に指定されたコレクションの要素を保持したHashSetを作成します。
HashSet(int) 引数に指定した容量の空のHashSetを作成します。
HashSet(int, float) 引数に指定した容量と負荷係数を持つ、空のHashSetを作成します。

※ HashSetはハッシュテーブルのキー項目数が容量と負荷係数をかけた値を上回った場合に、容量を約2倍に増やします。負荷係数のデフォルト値0.75は、多くの場合において適切な値であり、それほど変更を検討する値ではないとAPIリファレンスに記載されています。

TreeSetクラスのコンストラクタ

コンストラクタ 説明
TreeSet( ) 要素の自然順序付けに従ってソートされた、空のTreeSetを作成します。
TreeSet(Collection) 引数に指定されたコレクションの要素を持ち、要素の自然順序付けに従ってソートされたTreeSetを作成します。
TreeSet(Comparator) 引数に指定されたComparatorに従ってソートされた、空のTreeSetを作成します。
TreeSet(SortedSet) 引数に指定されたSortedSetと同じ要素、同じ順序付けをもつ、新しいTreeSetを作成します。

LinkedHashSetクラスのコンストラクタ

コンストラクタ 説明
LinkedHashSet( ) 初期容量(16)、負荷係数(0.75)の空のLinkedHashSetを作成します。
LinkedHashSet(Collection) 引数に指定されたコレクションの要素を保持したLinkedHashSetを作成します。
LinkedHashSet(int) 引数に指定した容量の空のLinkedHashSetを作成します。
LinkedHashSet(int, float) 引数に指定した容量と負荷係数を持つ、空のLinkedHashSetを作成します。

Setのメソッド

HashSetクラス、TreeSetクラス、LinkedHashSetクラスの双方で定義されている主要なメソッドを紹介します。各クラスのメソッドの詳細は、APIリファレンスを参照してください。

戻り型 メソッド 説明
boolean add(Object) 引数で指定された要素が、セットに存在しない場合追加されます。
boolean addAll
(Collection)
引数で指定されたコレクションの要素すべてが、セットに存在しない場合追加されます。
void clear( ) セットからすべての要素を削除します。
boolean contains
(Object)
引数で指定された要素が、セットに存在する場合trueを返します。
boolean containsAll
(Collection)
引数で指定されたコレクションの要素すべてが、セットに存在する場合trueを返します。
boolean remove
(Object)
引数で指定された要素が、セットに存在する場合その要素を削除します。
boolean removeAll
(Collection)
引数で指定されたコレクションの要素の内、セットに含まれる要素を削除します。
boolean retainAll
(Collection)
引数で指定されたコレクションの要素の内、セットに含まれる要素を、セット内に保持します。
Object[] toArray( ) セット内のすべての要素が格納されている配列を返します。
Object[] toArray
(Object[])
セット内のすべての要素が格納されている配列を返します。配列の実行時の型は引数で指定された型になります。

【例2】要素を集合的に取り扱うメソッドを、使用した例です。

import java.util.*;

public class ExCollection6 {
    public static void main(String[] args) {
        Set ts = new TreeSet();  //(1)tsオブジェクトを生成

        Set ts1 = new TreeSet();  //(2)ts1オブジェクトを生成
        //(3)ts1オブジェクトに要素を追加
        for (int i = 1; i < 4; i++) {
           ts1.add(new Integer(i));
        }

        Set ts2 = new TreeSet();  //(4)ts2オブジェクトを生成
        //(5)ts2オブジェクトに要素を追加
        for (int i = 4; i < 7; i++) {
            ts2.add(new Integer(i));
        }

        ts.addAll(ts1);  //(6)ts1オブジェクトを追加
        ts.addAll(ts2);  //(7)ts2オブジェクトを追加
        System.out.println("ts1,ts2を追加:" + ts);  //(8)tsオブジェクトを表示

        ts.retainAll(ts1);  //(9)ts1オブジェクトを保持
        System.out.println("ts1のみ保持:" + ts);  //(10)tsオブジェクトを表示

        //(11)tsオブジェクトを確認
        if (ts.containsAll(ts1)) {
            ts.addAll(ts2);  //(12)ts2オブジェクトを追加
        }
        System.out.println("ts2を追加:" + ts);  //(13)tsオブジェクトを表示
    }
}

解説2

  1. (1)TreeSetクラスのtsオブジェクトを生成します。
  2. (2)TreeSetクラスのts1オブジェクトを生成します。
  3. (3)forループでts1オブジェクトに要素1,2,3を追加します。
  4. (4)TreeSetクラスのts2オブジェクトを生成します。
  5. (5)forループでts1オブジェクトに要素4,5,6を追加します。
  6. (6)tsオブジェクトにaddAllメソッドを使用し、ts1オブジェクトを追加します。
  7. (7)tsオブジェクトにaddAllメソッドを使用し、ts2オブジェクトを追加します。
  8. (8)ts1、ts2オブジェクトが追加されたtsオブジェクトを表示します。
  9. (9)retainAllメソッドを使用し、tsオブジェクトの要素の内、ts1オブジェクトの要素のみを保持します。
  10. (10)ts1オブジェクトの要素のみを保持したtsオブジェクトを表示します。
  11. (11)containsAllメソッドを使用し、tsオブジェクトの要素内に、ts1オブジェクトの要素が含まれるか確認します。含まれる場合、if文内を実行します。
  12. (12)tsオブジェクトにaddAllメソッドを使用し、ts2オブジェクトを追加します。
  13. (13)ts2オブジェクトが追加されたtsオブジェクトを表示します。

実行結果2

D:\JAVA>javac ExCollection6.java

D:\JAVA>java ExCollection6
ts1,ts2を追加:[1, 2, 3, 4, 5, 6]
ts1のみ保持:[1, 2, 3]
ts2を追加:[1, 2, 3, 4, 5, 6]

D:\JAVA>

3Set