【问题标题】:What's the cleanest way to turn a TraversableOnce[T] into a Multiset-like or Histogram-ish Map[T, Int]?将 TraversableOnce[T] 转换为类似 Multiset 或 Histogram-ish Map[T, Int] 的最简洁方法是什么?
【发布时间】:2013-03-29 04:51:56
【问题描述】:

我想将 Traversable[T] 转换为带有计数的 Map[T, Int] 直方图。我希望结果是一个不可变的 Map ,它与我所做的事情相匹配:

traversable.groupBy(_).mapValues(_.length)

但看起来这在空间或时间方面效率不高......因为groupBy 维护对可遍历对象中每个元素的引用,这在具有少量唯一键的大型可遍历对象上表现不佳。我真的想要更多这样的东西:

def histogram[T](ts : Traversable[T]) : Map[T, Int] = {
  val map = new collection.mutable.HashMap[T, Int].withDefaultValue(0)
  ts.foreach { map(_) += 1 }
  map.toMap
}

有没有一种库方法可以给我这个结果(理想情况下,可以很好地与并行集合一起使用)?

【问题讨论】:

  • 默认情况下没有任何内容,为了简洁明了,您的内容与任何内容一样好。

标签: scala multiset


【解决方案1】:

这是我的扩展,与您的建议非常相似:

implicit final class RichIterable[A](val it: TraversableOnce[A]) extends AnyVal {
  def histogram: Map[A, Int] = {
    var res = Map.empty[A, Int] withDefaultValue 0
    it.foreach { elem =>
      res += elem -> (res(elem) + 1)
    }
    res
  }
}

不一定是最快的解决方案,但简洁:)

【讨论】:

    【解决方案2】:

    t.foldLeft(Map.empty[Int, Int].withDefaultValue(0)) { (acc, i) => acc.updated(i, acc(i) + 1) }

    【讨论】:

    • 对不起,我的版本不是通用的,但你可以很容易地做到这一点
    【解决方案3】:

    我会考虑使用您的直方图函数拉动可遍历的数据。创建一个将“toHistogram[T]”添加到可遍历的隐式类。我认为标准库中没有该功能。

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2012-03-10
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多