Java 在Guava中,如何创建具有单个元素和n个引用的多重集

Java 在Guava中,如何创建具有单个元素和n个引用的多重集,java,guava,multiset,Java,Guava,Multiset,我想在Guava中创建一个(不可变)Multiset,它有一个单一条目元素,其中出现次数出现次数,这两个在编译时都是未知的 我想到的是: ImmutableMultiset.<X>builder().addCopies(element, occurrences).build() ImmutableMultiset.builder().addCopies(元素、实例).build() 我想我在寻找这样的方法: public static ImmutableMultiset<X

我想在Guava中创建一个(不可变)Multiset,它有一个单一条目
元素
,其中出现次数
出现次数
,这两个在编译时都是未知的

我想到的是:

ImmutableMultiset.<X>builder().addCopies(element, occurrences).build()
ImmutableMultiset.builder().addCopies(元素、实例).build()
我想我在寻找这样的方法:

public static ImmutableMultiset<X> ImmutableMultiset.nOccurrencesOf(
X element, int occurrences){}
公共静态ImmutableMultiset ImmutableMultiset.noCurrencessof(
X元素,int出现次数){}
或:

public static ImmutableMultiset multiset.singletonMultiset(
X元素,int出现次数){}

是否有我忽略的方法可以缩短上述代码?

这里有另一个选项,但它似乎没有您提供的生成器选项好:

Multiset<X> set = HashMultiset.create();
set.add(element, occurrences);
ImmutableMultiset<X> immutableSet = ImmutableMultiset.copyOf(set);
Multiset set=HashMultiset.create();
集合。添加(元素、引用);
ImmutableMultiset immutableSet=ImmutableMultiset.copyOf(集合);

这里是另一个选项,但它似乎没有您介绍的生成器选项好:

Multiset<X> set = HashMultiset.create();
set.add(element, occurrences);
ImmutableMultiset<X> immutableSet = ImmutableMultiset.copyOf(set);
Multiset set=HashMultiset.create();
集合。添加(元素、引用);
ImmutableMultiset immutableSet=ImmutableMultiset.copyOf(集合);

这里是番石榴


坚持建筑商。它已经非常简单地解决了这个问题,并且只涉及一行内容;这可能不是一个需要自己特殊方法的常见案例。

这里是番石榴贡献者


坚持建筑商。它已经非常简单地解决了这个问题,并且只涉及一行内容;这可能不是一个需要自己特殊方法的常见情况。

这里有一个不使用生成器的单行解决方案

ImmutableMultiset<X> multiset = 
  ImmutableMultiset.copyOf(Collections.nCopies(occurrences, element));
不可变多集多集=
ImmutableMultiset.copyOf(Collections.nCopies(事件,元素));

但是,这有一个缺点:它的运行时会随着事件的数量而变化。为了获得更好的性能,请使用其他方法之一。

这里有一个不使用生成器的单行解决方案

ImmutableMultiset<X> multiset = 
  ImmutableMultiset.copyOf(Collections.nCopies(occurrences, element));
不可变多集多集=
ImmutableMultiset.copyOf(Collections.nCopies(事件,元素));

但是,这有一个缺点:它的运行时会随着事件的数量而变化。要获得更好的性能,请使用其他方法。

更糟的是,我的是一行。更糟的是,我的是一行。你发现的有什么问题?当一个简单的解决方案已经存在时,番石榴不会为每个可能的用例给出不同的签名。使用构建器似乎就是这样。@JohnB在ImmutableMultiset中有许多不同的重载方法,我觉得奇怪的是,这个方法丢失了。我想,既然他们把它放在了构建器中,他们就没有必要直接把它放在类中。请注意,类中唯一的
add
方法正好满足接口并引发异常。我遇到的主要问题是,在我的版本中,泛型类型信息丢失,我必须参数化builder()调用。一个专门的方法可以改变这一点。虽然这会很好,但我不认为番石榴团队会做出这种改变。添加的方法的价值将非常有限,因为它们将创建一个不可变的集合,其中不能添加额外的元素。它们会使情况变得非常罕见,在一个集合中,您只需要5个X实例。当前的构建器允许使用通常需要的灵活性。通用规范是一个很小的代价。你发现了什么问题?当一个简单的解决方案已经存在时,番石榴不会为每个可能的用例给出不同的签名。使用构建器似乎就是这样。@JohnB在ImmutableMultiset中有许多不同的重载方法,我觉得奇怪的是,这个方法丢失了。我想,既然他们把它放在了构建器中,他们就没有必要直接把它放在类中。请注意,类中唯一的
add
方法正好满足接口并引发异常。我遇到的主要问题是,在我的版本中,泛型类型信息丢失,我必须参数化builder()调用。一个专门的方法可以改变这一点。虽然这会很好,但我不认为番石榴团队会做出这种改变。添加的方法的价值将非常有限,因为它们将创建一个不可变的集合,其中不能添加额外的元素。它们会使情况变得非常罕见,在一个集合中,您只需要5个X实例。当前的构建器允许使用通常需要的灵活性。通用规范只是一个小小的代价,这正是我所担心的。现在在我自己的代码库中有一个
.singletonMultiset(X元素,int引用)
。谢谢你的信息,这正是我担心的。现在在我自己的代码库中有一个
.singletonMultiset(X元素,int引用)
。谢谢你的信息。很好。它和构建器版本一样庞大(除了它不需要我传递泛型参数),所以我仍然坚持我的工厂方法方法,但这绝对是一个有效的答案,可以使图片更完整。很好。它和构建器版本一样庞大(除了它不需要我传递泛型参数),所以我仍然坚持使用工厂方法,但这绝对是一个有效的答案,可以使图片更加完整。