【问题标题】:Why is there no direct implemention of Bag in java collection framework?为什么java集合框架中没有直接实现Bag?
【发布时间】:2013-03-25 06:09:06
【问题描述】:

我不明白为什么 JCF(Java 集合框架)没有 Bag 实现(允许重复而不维护顺序)。 Bag 的性能将比 JCF 中当前的 Collection 实现好得多。

  • 我知道如何在 Java 中实现Bag
  • 我知道 Bag 在 Apache commons 中可用。
  • 我知道还有其他实现可以用作Bag,但与Bag 相比,其他实现还有很多工作要做。

为什么 Java Collections 框架没有提供这样的直接实现?

【问题讨论】:

  • This 可能值得一看

标签: java collections


【解决方案1】:

发布我的评论作为答案,因为它最好地回答了这个问题。

来自here 提交的错误报告:

的维护者没有太多的热情 用于设计和实现这些接口/类的集合框架。 我个人不记得需要一个。会更有可能 将导入在 JDK 之外开发的流行包 在现实世界中证明了它的价值后进入 JDK。

对 Bags 的支持需求在今天仍然有效。

Guava 支持它。还有GS-Collections

【讨论】:

  • 当我不得不生成集合的散列时,我真的需要使用 Bag,不考虑排序,但考虑到重复项。 List.hashcode() 考虑元素的顺序。 Set.hashset() 可以正确地考虑顺序,但也会考虑重复的元素。在这种情况下,唯一正确的 hashcode() impl 可能是 Bag 实现。这是一个规范的 JSON 签名。
【解决方案2】:

目前,bag 违反了收款合同。许多方法与当前的集合规则相冲突。

“Bag 是一个 Collection,它计算对象在集合中出现的次数。假设您有一个包含 {a, a, b, c} 的 Bag。在 a 上调用 getCount(Object) 将返回 2,而调用 uniqueSet() 将返回{a, b, c}

请注意,此接口违反了 Collection 合同。许多这些方法中指定的行为与 Collection 指定的行为不同。不合规的方法在其摘要行中清楚地标有“(违规)”。此类的未来版本将指定与 Collection 相同的行为,不幸的是这将破坏与此版本的向后兼容性。”

 boolean add(java.lang.Object o)
      (Violation) Add the given object to the bag and keep a count.

 boolean removeAll(java.util.Collection c)
      (Violation) Remove all elements represented in the given collection, respecting cardinality.

更多信息请查看链接:HERE

【讨论】:

  • 在此处包含链接中的文本。
  • 什么是收款合同?
  • 您引用的文档部分不属于违规行为。
  • @JimmyT。它确实违反了,因为 Bag 正在计数。集合在将数据插入结构时不会保留计数。 Bag 本身的文档表明它违反了 Collection 的规则。 'add' 和 'removeAll' 方法也是如此
  • 违规只是返回值。计数只是重复的不同表示。仅此一点并不违反界面。
【解决方案3】:

JDK 尝试为您提供通用数据结构的实现,并允许您在通用结构无法满足您的目的时实现任何东西。他们可能认为这不是常见的数据结构。从实用性来看,他们不可能实现每个数据结构或满足每个人的要求。你认为常见的东西可能对大多数人来说并不常见。

【讨论】:

  • 包包在收藏区很常见!我看到很多次人们使用其他集合实现而不是包。只是因为在 JCF 中没有任何 Bag 的直接实现,所以他们必须为其他集合支付一些额外的开销。 i Believe Bag 是最常见的系列。
  • '包在收藏区很常见',这又是你的经验。在我的职业生涯中,我只需要使用一次包/多件套。我想这取决于你的工作。
  • Ajay George 提供的问题链接可以回答你的问题。
猜你喜欢
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2018-05-29
相关资源
最近更新 更多