Java Setインターフェース
Setは、Collectionインタフェースを拡張したインタフェースで、Java Collections Frameworkに属しています。一意な要素のコレクションを表し、要素の重複を許しません。SetにはHashSet, TreeSet, LinkedHashSetなどいくつかの実装があります。
- HashSet: ハッシュテーブルを使った集合の実装です。高速な検索、追加、削除操作が可能ですが、要素の順序は保証されません。
- TreeSet: ストレージに木構造を使用する集合の実装です。要素の昇順、自然順序、または作成時に指定されたComparatorに基づく順序が保証されています。
- LinkedHashSet: HashSetに似た集合の実装ですが、要素が集合に追加された順序を維持します。
HashSet, TreeSet, LinkedHashSetは、実際には内部でMapの実装クラスであるHashMapやTreeMap、LinkedHashMapをそのまま利用しています。Mapはキーと値をセットにして表し、キーの重複は許容されません。これらのSetは要素をMapのキーに保存し、値にダミーの値を入れることでデータを保存しています。
Java Setインタフェースの実装
Setインタフェースから直接オブジェクトを作成することはできないので、実装クラスを使ってオブジェクトを作成します。例えば、HashSetクラスを使うと、次のような集合を作成することができます。
Set<String> set = new HashSet<>();
Java Setインタフェースのメソッド
JavaのSetインタフェースには、メソッドがいくつか用意されています。
- add(E element): 指定された要素が存在しない場合、要素を集合に追加します。
- addAll(Collection<? extends E> c): 指定されたコレクションに含まれるすべての要素を集合に存在しない場合追加します。
- clear(): 集合からすべての要素を削除します。
- contains(Object o): 指定された要素が集合に含まれている場合はtrueを、そうでない場合はfalseを返します。
- containsAll(Collection<?> c): 集合が指定されたコレクション内のすべての要素を含む場合にtrueを、そうでない場合にfalseを返します。
- isEmpty(): 集合が空の場合にtrueを、そうでない場合にfalseを返します。
- iterator(): 集合の要素に順次アクセスするために使用できるイテレータを返します。
- remove(Object o): 指定された要素を集合から削除します。
- removeAll(Collection<?> c): 指定されたコレクション内のすべての要素を集合から削除します。
- size(): 集合に含まれる要素の数を返します。
- toArray(): 集合に含まれるすべての要素を含む配列を返します。
集合に要素を追加するには、addメソッドを使用します。
import java.util.HashSet;
class Main{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println(set); // [banana, orange, apple]
}
}
ある要素が集合に含まれているかどうかを確認するには、containsメソッドを使用します。
import java.util.HashSet;
class Main{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("apple");
System.out.println(set.contains("apple")); // true
System.out.println(set.contains("banana")); // false
}
}
集合から要素を削除するには、removeメソッドを使用します。
import java.util.HashSet;
class Main{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
System.out.println(set); // [banana, apple]
set.remove("apple");
System.out.println(set); // [banana]
}
}
Java Setのループ
SetのルートインタフェースにIterableインタフェースがあるため、拡張for文(for-each)を利用できます。インデックスを使ったfor文は使えません。for-eachループを使って集合内の要素を反復処理する例を見てみましょう。
import java.util.HashSet;
class Main{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("mango");
set.add("melon");
for (String element : set) {
System.out.println(element);
}
}
}
iteratorを使う場合や、Java8で導入されたStreamを使ってループするには以下のようになります。
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
import java.util.stream.*;
class Main{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("mango");
set.add("kiwi");
// Iteratorを使ったループ
Iterator<String> ite = set.iterator();
while (ite.hasNext()) {
System.out.println(ite.next());
}
// Streamを使ったループ
set.stream().forEach(System.out::println);
Set<String> set2 = set.stream().filter(x -> x.length() > 4).collect(Collectors.toSet());
System.out.println(set2);
}
}