【Java】Setの基本について

スポンサーリンク

Java の Set についての基本をまとめました。

Setとは

java.util.Setインターフェースはセットとしての振る舞いを規定した重複のない要素の集まりであるコレクションです。 リストと比較すると違いがよく分かります。リストは順序どおりに並んだ要素の集まりで重複要素を持てますが、セットの場合、順序は無関係で要素に重複はありません

Set インターフェースを実装している主な具象クラスはjava.util.HashSetjava.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 (Java Platform SE 8)

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);