2012-06-05 72 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

不错。它和构建器版本一样大(除了它不需要我传递泛型参数),所以我仍然坚持使用我的工厂方法,但这绝对是一个有效答案,可以使图片更加完整。 –