我有一個不可變的集合(投射爲Set<Integer>
),可能包含許多元素。我需要一個集合,其中包含來自該集合的元素以及一個附加元素。我有適當的代碼來複制集合,然後追加元素,但我正在尋找能夠使事物儘可能高效的正確方法。將單個元素添加到不可變集合的高效優雅方法是什麼?
我有番石榴可用,但我不需要它的使用。
我有一個不可變的集合(投射爲Set<Integer>
),可能包含許多元素。我需要一個集合,其中包含來自該集合的元素以及一個附加元素。我有適當的代碼來複制集合,然後追加元素,但我正在尋找能夠使事物儘可能高效的正確方法。將單個元素添加到不可變集合的高效優雅方法是什麼?
我有番石榴可用,但我不需要它的使用。
不確定的表現,但你可以用番石榴的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);
如果Set是不可變的,除了複製Set,然後添加新的元素外,我沒有看到任何其他方法。記住,複製一個集合就像在創建新集合時將基本集合傳遞給構造函數一樣簡單。
當我在同一個句子中讀到「不可變」和「添加到」時,我正在經歷認知失調。您可以將新元素添加到不可變值的可變副本的末尾,但不能修改不可變集。我不知道任何優雅。
你可能會考慮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中)
我認爲這是暗示的;問題是關於如何實現這一點。 – sdgfsdh 2017-05-22 11:16:43