Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > コレクション・フレームワーク −3.Set
更新日:2006/3/17
コレクション・フレームワーク−3.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). .引数にHashSetオブジェクトと、キーワード”HashSet”を引数に取り、メソッドshowFeatureを呼び出します。
(2). 引数にTreeSetオブジェクトと、キーワード”TreeSet”を引数に取り、メソッドshowFeatureを呼び出します。
(3). 引数にLinkedHashSetオブジェクトと、キーワード”LinkedHashSet”を引数に取り、メソッドshowFeatureを呼び出します。
(4). .showFeatureメソッドでは、引数にSetインタフェース型変数exSetを取っています。インタフェース型の変数はそのインタフェースを実装したオブジェクトを代入することができます。これは、HashSetクラス、TreeSetクラス、LinkedHashSetクラスごとにshowFeatureメソッドを用意する必要がないことを表します。
(5). 各クラスのオブジェクトに代入する要素の配列を生成します。
(6). forループを使用し、配列内の要素を各オブジェクトに代入します。
(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). TreeSetクラスのtsオブジェクトを生成します。
(2). TreeSetクラスのts1オブジェクトを生成します。
(3). forループでts1オブジェクトに要素1,2,3を追加します。
(4). TreeSetクラスのts2オブジェクトを生成します。
(5). forループでts1オブジェクトに要素4,5,6を追加します。
(6). tsオブジェクトにaddAllメソッドを使用し、ts1オブジェクトを追加します。
(7). tsオブジェクトにaddAllメソッドを使用し、ts2オブジェクトを追加します。
(8). ts1、ts2オブジェクトが追加されたtsオブジェクトを表示します。
(9). retainAllメソッドを使用し、tsオブジェクトの要素の内、ts1オブジェクトの要素のみを保持します。
(10). ts1オブジェクトの要素のみを保持したtsオブジェクトを表示します。
(11). containsAllメソッドを使用し、tsオブジェクトの要素内に、ts1オブジェクトの要素が含まれるか確認します。含まれる場合、if文内を実行します。
(12). tsオブジェクトにaddAllメソッドを使用し、ts2オブジェクトを追加します。
(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>




このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道