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