【问题标题】:In Guava, how to create a Multiset with a single element and n occurrences在 Guava 中,如何创建具有单个元素和 n 次出现的 Multiset
【发布时间】:2012-06-09 08:38:51
【问题描述】:

我想在 Guava 中创建一个(不可变的)Multiset,它有一个条目 element,出现 occurrences,这两个条目在编译时都是未知的。

我想出的是这样的:

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){}

是否有任何我忽略的方法可以使上述代码更短?

【问题讨论】:

  • 您的发现有什么问题?当一个简单的解决方案已经存在时,Guava 不会倾向于为每个可能的用例给出不同的签名。使用构建器似乎就是这种情况。
  • @JohnB ImmutableMultiset中有很多不同的重载方法,我觉得奇怪的是缺少这个
  • 我认为既然他们把它放在了构建器中,他们认为没有必要直接把它放在类中。请注意,该类中唯一的 add 方法只是为了满足接口并引发异常。
  • 我遇到的主要问题是,在我的版本中,泛型类型信息丢失了,我必须参数化 builder() 调用。一种专门的方法可以改变这一点。
  • 虽然会很好,但我没有看到 guava 团队做出这种改变。添加的方法的价值非常有限,因为它们会创建一个不可变的集合,其中不能添加任何其他元素。他们会提出这样一种情况,即您在一个集合中唯一想要的东西是 X 的 5 个实例的情况非常罕见。当前的构建器以通常需要的灵活性来实现这一点。通用规范是一个很小的代价。

标签: java guava multiset


【解决方案1】:

这是另一个选项,但它似乎不如您提供的构建器选项好:

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

【讨论】:

  • 更糟糕的是,我的是单线的。
【解决方案2】:

Guava 贡献者在这里。

坚持建设者。它已经非常简单地解决了这个问题,并且在一行中;这可能不是一个常见的情况,需要自己的特殊方法。

【讨论】:

  • 这就是我所担心的。所以现在我自己的代码库中有一个.singletonMultiset( X element, int occurrences)。感谢您的信息。
【解决方案3】:

这是一个不使用构建器的单行解决方案。

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

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

【讨论】:

  • 不错。它和构建器版本一样笨重(除了它不需要我传递泛型参数),所以我仍然会坚持我的工厂方法方法,但这绝对是使图片更完整的有效答案.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2011-03-03
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多