2016-06-11 87 views
0

我奮力如何執行用Guava ImmutableSortedMultiset基本操作...添加(刪除)元素(S)從ImmutableSortedMultiset

  • 如何將一個創建現有ImmutableSortedMultiset是副本包含一個新的元件?
  • 如何創建其中一個元素已被刪除的現有ImmutableSortedMultiset的副本?

如果可能,我想是能夠在不每次添加新元素時間排序的現有的集合執行這些操作(已刪除)。

+1

如果不對現有集合進行排序,則無法執行此操作。 (雖然我認爲對於只有一個不同元素的情況,排序很可能是O(n),這與你將要得到的結果一樣好。) –

+2

這是* not *用例不可變集合被設計因爲,要清楚。你正在尋找持久集合。 –

+0

@LouisWasserman感謝您的提示。我將谷歌關於持久收藏。 – davidrpugh

回答

1

我不認爲你可以不重建一個新的ImmutableSortedMultiset。假設你有一個original多集,我會通過使使用方法的複合視圖中Multiset開始:隨後創建不可改變的排序副本

// View with one more element 
Multiset<String> view = Multisets.union(original, ImmutableMultiset.of("a")); 

// View with one less element 
Multiset<String> view = Multisets.difference(original, ImmutableMultiset.of("a")); 

ImmutableSortedMultiset<String> copy = ImmutableSortedMultiset.copyOf(view); 
1

這實際上是一個棘手的問題,因爲據我所知番石榴沒有提供任何簡單的方法來實現你的目標。也許你不應該在處理不可變集合,如果你需要改變它們。例如,您可以將數據存儲在可變的SortedMultiset中,並在需要將其傳遞到某處時製作防禦副本。

但是,這些操作仍然有可能。

添加和複製

爲了在不可變集合添加元素,你需要使用建設者

ImmutableSortedMultiset<T> original = ...; //your original data which you want to modify 
T element = ...; //new element which you want to add 
ImmutableSortedMultiset<T> result = ImmutableSortedMultiset.<T>naturalOrder() 
            .addAll(original) //copying original data 
            .add(element) 
            .build(); 

刪除和複製

這裏事情變得有點困難因爲您需要過濾原始收集並排除要刪除的元素

ImmutableSortedMultiset<T> original = ...; 
T el = ...; //element which you want to remove 
ImmutableSortedMultiset<T> result = ImmutableSortedMultiset.copyOf(//copy... 
           Collections2.filter(original, //and filter 
           Predicates.not(Predicates.equalTo(el))); 

您必須將其包裝到一個方法中,以使其更易於使用。

但是,我強烈建議你使用可變集合,而不是不可變,如果你真的需要修改它們。

+0

請注意,刪除版本會刪除等於「e1」的_all_元素,而不僅僅是一個。請記住,我們正在使用Multiset! –