【问题标题】:Are Multisets missing in Scala?Scala中缺少多重集吗?
【发布时间】:2013-01-15 00:53:50
【问题描述】:

我在 Scala 中尝试了 Facebook Hacker Cup 2013 资格问题,对于第三个问题,我觉得需要一个有序的 Multiset,但在 scala (2.10) 的集合中找不到。 scala 的集合中是否缺少此数据结构。它会在未来的版本中实现吗?如果您已经实现了一个集合,那么 Multiset 是否真的不需要?

【问题讨论】:

  • LinkedHashSetSet-s ?无论如何它不会显示那些难题,因为Facebook登录,你推广Facebook吗? =)
  • 这很奇怪,但是页面上说马克是杯赛的冠军。
  • 不,我不推广FB。这只是一个诚实的问题,我试图提供一点背景:)

标签: scala set multiset


【解决方案1】:

多重集有时会非常有用。我经常发现自己手动编码Map[K, List[V]]。 Nicolas Stucki 有一个很棒的多重集实现,称为 Bag,并在 Maven 上发布。

在此宣布:

https://groups.google.com/forum/#!topic/scala-internals/ceaEAiQPgK4

代码在这里:

https://github.com/nicolasstucki/multisets

马文:

https://github.com/nicolasstucki/multisets/blob/master/MavenRepository.md

【讨论】:

  • 我想知道你为什么要实现Map[K, List[V]。 @Steve 在对已接受答案的评论中提到的 Map[T, Int] 对我来说更有意义。
  • 取决于您的用例 - 根据equals,有时您的元素是相等的,但有您想要保留的额外信息。
  • 在SBT项目中导入的代码是libraryDependencies ++= Seq("io.github.nicolasstucki" %% "multisets" % "0.4")
  • 对于它的价值,Map[K, List[V]] 真的是MultiMap,Scala 确实有一个特点:scala-lang.org/api/2.12.3/scala/collection/mutable/…
【解决方案2】:

多重集是一种相当特殊且不常见的数据结构。例如,它也不是 Java 标准库的一部分。 Guava 确实有,Boost 也有,但 Boost 基本上什么都有。

如果您只想计算元素出现的次数,则可以使用SortedMap from element to count 来代替。另一方面,如果您要求元素是不同的、可检索的,但在排序规则下是等效的,您可以使用 SortedMap 从元素(不重要)到 Set 的可区分元素。

【讨论】:

  • 我不同意“多重集是一种相当奇特和不常见的数据结构”。如果您正在做诸如计算单词或制作事物直方图之类的事情,那么多重集是一种极其常见的数据结构。
  • Python's standard libraryC++'s standard library 以及Java 集合库的两个非常常见的扩展Apache commonsGuava 中有 个多重集。鉴于此,我只是不明白你怎么能声称它是“特殊和不寻常的”。
  • 直接来自 Python Counter 类文档:“Counter 类类似于其他语言中的 bag 或 multisets”。
  • 也许您可以评论一下您认为的区别是什么?基于formal definition,多重集本质上是Map[T, Int],而这正是Python 所提供的。
  • 我明白了,所以虽然 C++PythonSmalltalk 都提供了内置的 multisets/bag 类,但你只计算 C++ 一个,因为它是唯一一个也实现了该语言的设置 API。我更像是一种实用性强的人——如果一个类提供了基本的多重集/包操作(is_element_of、迭代、计数等),那么我将其视为多重集/包。
【解决方案3】:

Seq trait 有diffintersect 甚至union。这应该可以帮助您解决很多多集问题。 http://www.scala-lang.org/api/2.11.7/index.html#scala.collection.Seq@diff(that:Seq[A]):Seq[A]

【讨论】:

    【解决方案4】:

    如果您只需要平等并且不太关心性能,则可以使用排序列表。

    【讨论】:

      【解决方案5】:

      https://github.com/scala/scala-collection-contrib中提供了可变和不可变的Multisets

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 2020-02-22
        • 1970-01-01
        相关资源
        最近更新 更多