我有一个可能包含许多元素的不可变集(强制转换为Set<Integer>
)。我需要一个Collection,其中包含该集合中的元素以及一个附加元素。我有kludgy代码来复制集合,然后附加元素,但我正在寻找使事情尽可能高效的正确方法。
我有可用的番石榴,但我不需要它。
答案 0 :(得分:32)
不确定性能,但您可以使用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);
答案 1 :(得分:5)
您可以考虑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&amp; java.util.Collections)
答案 2 :(得分:4)
您有三种选择。
有时,BitSet
是比Set<Integer>
更好的选择,具体取决于您的值的分布。
答案 3 :(得分:4)
使用Java 8,您还可以使用流来实现这种效果
Stream.concat(oldSet.stream(),
Stream.of(singleElement))
.collect(toSet())
答案 4 :(得分:3)
如果Set是不可变的,除了复制Set之外,我看不到任何其他方法,然后添加新元素。请记住,复制集合就像在创建新集合时将基集传递给构造函数一样简单。
答案 5 :(得分:0)
当我在同一个句子中读到“不可变”和“加法”时,我正在经历认知失调。您可以在不可变值的可变副本的末尾添加新元素,但不能修改不可变集。我不知道什么优雅。
答案 6 :(得分:0)