scala - 计算 Scala 中 List[List[T]] 中每个元素的出现次数

标签 scala scala-collections

假设你有

val docs = List(List("one", "two"), List("two", "three"))

哪里例如List("one", "two") 表示包含术语“一”和“二”的文档,并且您希望使用每个术语的文档频率构建 map ,即在这种情况下
Map("one" -> 1, "two" -> 2, "three" -> 1)

你会如何在 Scala 中做到这一点? (并且以一种有效的方式,假设一个更大的数据集。)

我的第一个类似 Java 的想法是使用可变映射:
val freqs = mutable.Map.empty[String,Int]
for (doc <- docs)
  for (term <- doc)
    freqs(term) = freqs.getOrElse(term, 0) + 1

这工作得很好,但我想知道如何以更“实用”的方式做到这一点,而无需求助于可变 map ?

最佳答案

docs.flatten.foldLeft(new Map.WithDefault(Map[String,Int](),Function.const(0))){
  (m,x) => m + (x -> (1 + m(x)))}

多惨的火车啊!

[编辑]

啊,这样更好!
docs.flatten.foldLeft(Map[String,Int]() withDefaultValue 0){
  (m,x) => m + (x -> (1 + m(x)))}

关于scala - 计算 Scala 中 List[List[T]] 中每个元素的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166317/

相关文章:

scala - sbt 编译需要很长时间才能完成

scala - 带有 Scala 延续的事件监听器

scala - 可以在实例化对象之前引用对象的成员吗?

scala - 如何在 Scala 中为 TreeSet 分配顺序而不重复我自己

scala - collection.mutable.OpenHashMap 与 collection.mutable.HashMap

scala - 如何在 Play/Scala 中对 Controller 进行单元测试

scala - 有没有更好的方法来显示整个 Spark SQL DataFrame?

scala - 如何旋转(圆形移位)Scala 集合

scala - 是否可以从 PriorityQueue 中删除元素?

scala - 类型推断器如何在 reduceLeft 上工作?