 |
 |
●コレクション・フレームワーク−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). |
クラスの要素の状態を表示します。
|
|
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( )
|
初期容量(16)、負荷係数(0.75)の空のHashSetを作成します。
|
|
HashSet(Collection)
|
引数に指定されたコレクションの要素を保持したHashSetを作成します。
|
|
HashSet(int)
|
引数に指定した容量の空のHashSetを作成します。
|
|
HashSet(int, float)
|
引数に指定した容量と負荷係数を持つ、空のHashSetを作成します。
|
|
|
※HashSetはハッシュテーブルのキー項目数が容量と負荷係数をかけた値を上回った場合に、容量を約2倍に増やします。負荷係数のデフォルト値0.75は、多くの場合において適切な値であり、それほど変更を検討する値ではないとAPIリファレンスに記載されています。
|
|
コンストラクタ
|
説明
|
|
TreeSet( )
|
要素の自然順序付けに従ってソートされた、空のTreeSetを作成します。
|
|
TreeSet(Collection)
|
引数に指定されたコレクションの要素を持ち、要素の自然順序付けに従ってソートされたTreeSetを作成します。
|
|
TreeSet(Comparator)
|
引数に指定されたComparatorに従ってソートされた、空のTreeSetを作成します。
|
|
TreeSet(SortedSet)
|
引数に指定されたSortedSetと同じ要素、同じ順序付けをもつ、新しいTreeSetを作成します。
|
|
|
コンストラクタ
|
説明
|
|
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オブジェクトを表示します。 |
|
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>
|
|
|
コレクション・フレームワーク |
|
|
| 3.Set |
|
|
|
|
 |
|
 |
 |