Java の Set についての基本をまとめました。
Setとは
java.util.Set
インターフェースはセットとしての振る舞いを規定した重複のない要素の集まりであるコレクションです。
リストと比較すると違いがよく分かります。リストは順序どおりに並んだ要素の集まりで重複要素を持てますが、セットの場合、順序は無関係で要素に重複はありません。
Set インターフェースを実装している主な具象クラスはjava.util.HashSet
やjava.util.LinkedHashSet
です。
Map の具象クラスと似ていますが、内部の実装ではその通り HashMap と LinkedHashMap をそのまま使用しています。
Map のキーも重複を許可しないので、キーをそのまま Set の実装として使っているのです。要素の追加も内部ではHashMap#put
ですし、 Iterator もHashMap#keySet().iterator()
を返します。
LinkedHashSet の場合は要素に順序を持たせることも可能です。
Setの基本メソッド
具象クラスで実装が必要な基本メソッドです。詳細な機能が知りたい場合は各具象クラスの Javadoc やソースコードを参照してください。
追加に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
add(E e) | boolean | 指定された要素がセット内になかった場合に追加。 |
addAll(Collection c) | boolean | 指定されたコレクションのすべての要素について、その要素がこのセット内にない場合に追加。 |
削除に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
remove(Object o) | boolean | 指定された要素がセット内にあった場合にセットから削除。 |
removeAll(Collection c) | boolean | セットから指定されたコレクションに含まれる要素をすべて削除。 |
clear() | void | 全ての要素をセットから削除。 |
比較・判定に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
contains(Object o) | boolean | 指定された要素がセットに含まれている場合に true を返す。 |
containsAll(Collection c) | boolean | 指定されたコレクションのすべての要素がセットに含まれている場合に true を返す。 |
equals(Object o) | int | 指定されたオブジェクトがセットと同じかどうかを比較。 |
isEmpty() | boolean | セットに要素が1つも含まれていない場合に true を返す。 |
size() | int | セット内の要素数を返す。 |
加工に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
iterator() | Iterator |
セット内の各要素についてのイテレータを返す。 |
retainAll(Collection c) | boolean | セット内の要素のうち、指定されたコレクション内にある要素だけを保持する。 |
toArray() | Object | セット内のすべての要素が格納されている配列を返す。 |
toArray(T a) | T[] | セット内のすべての要素を格納している配列を返す。返される配列の実行時の型は指定された配列の型になる。 |
hashCode() | int | セットのハッシュコード値を返す。 |
defaultメソッド
Java 8 から追加された Collection / Iterable インターフェースの default メソッドです。
メソッド | 戻り値 | 機能 |
---|---|---|
spliterator() | Spliterator |
Set内の要素に対する Spiliterator を返す。 |
removeIf(Predicate filter) | boolean | 条件を満たす場合は要素を削除する。戻り値は要素が1つでも削除された場合は true を返す。 |
stream() | Stream |
順次ストリームを返す。 |
parallelStream() | Stream |
並列ストリームを返す。 |
forEach(Consumer action) | void | 指定されたアクションを全ての要素に実行する。 |
Setの繰り返し処理
イテレータを使うパターンの順次繰り返し処理です。
Set<String> set = new HashSet<>(); Collections.addAll(set, "hoge", "fuga", "bar"); for (Iterator<String> itr = set.iterator(); itr.hasNext();) { System.out.println(itr.next()); } Iterator<String> itr = set.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); }
Set は Collection / Iterable インターフェースを継承しているので拡張 for 文を使って順次処理をすることが可能です。インデックスを使用したループは使えません。
for(String str : list) {
System.out.println(str);
}
Java 8 からは Stream や default メソッドの forEach を使用して順次処理を実行できます。
set.stream().filter(v -> v.length() == 4).collect(Collectors.toSet());
set.stream().map(String::toUpperCase).collect(Collectors.toSet());
set.forEach(System.out::println);