2012-06-05 70 views
0

我想在番石榴創建一個具有單個條目element的(不可變)Multiset,出現的次數爲occurrences,兩者在編譯時都不知道。在番石榴,如何用單個元素創建多重集併發生n

我想出的是這樣的:

ImmutableMultiset.<X>builder().addCopies(element, occurrences).build() 

我想我一直在尋找這樣的方法:

public static ImmutableMultiset<X> ImmutableMultiset.nOccurrencesOf(
X element, int occurrences){} 

或:

public static ImmutableMultiset<X> Multisets.singletonMultiset(
X element, int occurrences){} 

有我忽略了哪些方法可以縮短上述代碼?

+3

你發現了什麼錯?當一個簡單的解決方案已經存在時,番石榴不會傾向於爲每個可能的用例提供不同的簽名。這似乎是使用構建器的情況。 –

+1

@JohnB在ImmutableMultiset中有很多不同的重載方法,我覺得很奇怪,這是一個缺失 –

+0

我認爲,因爲他們把它放在構建器中,他們沒有看到需要直接放在類中。請注意,類中唯一的'add'方法就是爲了滿足接口並引發異常。 –

回答

1

番石榴貢獻者這裏。

堅持與建設者。它已經很簡單地解決了這個問題,並且只用了一行。要求自己的特殊方法可能不是一個普遍的情況。

+0

這就是我所害怕的。所以現在在我自己的代碼庫中有一個'.singletonMultiset( X元素,int出現)'。謝謝(你的)信息。 –

1

這裏是另一種選擇,但它似乎並不像你提出的建設者選項一樣好:

Multiset<X> set = HashMultiset.create(); 
set.add(element, occurrences); 
ImmutableMultiset<X> immutableSet = ImmutableMultiset.copyOf(set); 
+0

更糟糕的是,我的單線遊戲。 –

+3

Concur。讓我想知道你爲什麼不喜歡你擁有的東西。 –

2

以下是不使用構建器的單行解決方案。

ImmutableMultiset<X> multiset = 
    ImmutableMultiset.copyOf(Collections.nCopies(occurrences, element)); 

但是,這有一個缺點:它的運行時間隨着出現次數而變化。爲了獲得更好的性能,請使用其他方法之一。

+0

不錯。它和構建器版本一樣大(除了它不需要我傳遞泛型參數),所以我仍然堅持使用我的工廠方法,但這絕對是一個有效答案,可以使圖片更加完整。 –