scala - 将 TraversableOnce[T] 转换为类似 Multiset 或直方图的 Map[T, Int] 最简洁的方法是什么?

标签 scala multiset

我想将 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
}

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

最佳答案

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

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

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

关于scala - 将 TraversableOnce[T] 转换为类似 Multiset 或直方图的 Map[T, Int] 最简洁的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15691022/

相关文章:

java - 懒惰斐波那契数列

c++ - 有没有一种方法可以在删除和插入c++中的元素时循环遍历multiset或unordered_set中的元素

algorithm - 为什么两个看似 lower_bound() 相同的方法有不同的处理时间

c++ - "multiset"& "multimap"- 有什么意义?

mongodb - Scala 根据最大​​值过滤列表

java - Fork-join 中的内存可见性

scala - 将一组函数应用于对象的语法

facebook - 从 Facebook 验证 X-Hub-Signature

r - 如何在R中生成对象的排列或组合?

c++ - 尝试理解 libstdc++ 对 std::multiset 的实现