不変セットがあります(Set<Integer>
)多くの要素が含まれている可能性があります。そのセットの要素と1つの追加要素を含むコレクションが必要です。セットをコピーして要素を追加するための適切なコードが用意されていますが、可能な限り効率を維持する正しい方法を探しています。
Guavaを使用できますが、使用する必要はありません。
パフォーマンスについてはわかりませんが、Guavaの ImmutableSet.Builder
:
import com.google.common.collect.ImmutableSet
// ...
Set<Integer> newSet = new ImmutableSet.Builder<Integer>()
.addAll(oldSet)
.add(3)
.build();
もちろん、そのためのヘルパーメソッドを自分で作成することもできます。
public static <T> Set<T> setWith(Set<T> old, T item) {
return new ImmutableSet.Builder<T>().addAll(old).add(item).build();
}
// ...
Set<Integer> newSet = setWith(oldSet, 3);
あなたはSets.union()を検討するかもしれません。構築は速くなりますが、使用は遅くなります。
public static <T> Set<T> setWith(Set<T> old, T item) {
return Sets.union(old, Collections.singleton(item);
}
(com.google.common.collect.Sets&Java.util.Collections)
3つのオプションがあります。
値の分布によっては、BitSet
がSet<Integer>
よりも適切な場合があります。
セットが不変である場合、セットをコピーしてから新しい要素を追加する以外に、それを行う方法はありません。セットのコピーは、新しいセットを作成するときに基本セットをコンストラクター関数に渡すのと同じくらい簡単です。
Java 8を使用すると、その効果のためにストリームを使用することもできます
Stream.concat(oldSet.stream(),
Stream.of(singleElement))
.collect(toSet())
同じ文で「不変」と「追加」を読んだときに、認知的不協和を経験しています。不変の値の可変コピーの最後に新しい要素を追加することはできますが、不変のセットを変更することはできません。エレガントなものは何も知りません。