Setは、Collectionインタフェースを拡張したインタフェースで、Java Collections Frameworkに属しています。一意な要素のコレクションを表し、要素の重複を許しません。SetにはHashSet, TreeSet, LinkedHashSetなどいくつかの実装があります。
Setインタフェースの実装クラスは、実際には内部でMapの実装クラスであるHashMapやTreeMap、LinkedHashMapをそのまま利用しています。Mapはキーと値をセットにして表し、キーの重複は許容されません。Setは要素をMapのキーに保存し、値にダミーの値を入れることでデータを保存しています。
Setインタフェースから直接オブジェクトを作成することはできないので、実装クラスを使ってオブジェクトを作成します。例えば、HashSetクラスを使うと、次のようなリストを作成することができます。
Set<String> set = new HashSet<>();
JavaのSetインタフェースには、メソッドがいくつか用意されています。
集合に要素を追加するには、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]
}
}
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);
}
}