我有一个文档列表,我希望在所有文档上找到(term -> termCount)对。我就是这样做的:
object termCount extends App {
val docs = List(
List("A", "B", "C", "C"),
List("A", "D"),
List("B", "B", "C"))
val countsMap = docs.flatMap { ts =>
val m = ts.map((_, 1)).groupBy(_._1)
m.map { e => e._1 -> e._2.foldLeft(0)(_ + _._2) }
}.groupBy(_._1)
.map { e => e._1 -> e._2.foldLeft(0)(_ + _._2) }
println(countsMap)
}产出:
Map(D -> 1, A -> 2, C -> 3, B -> 3)要把它分解成行动,我要做的是:
(term, 1)元组的生成
ts.map((_,1)).groupBy(_._1)e => e._1 -> e._2.foldLeft(0)(_ + _._2)Map -本地(term -> termCount)条目(term, termCount)foldLeft来获取全局术语数。我的问题是,如何使这段代码更简洁?
发布于 2014-01-30 20:30:44
这是相当简洁的:
scala> docs.flatten.groupBy(identity).map { case (k,vs) => (k,vs.size)}
res0: scala.collection.immutable.Map[String,Int] = Map(D -> 1, A -> 2, C -> 3, B -> 3)帮助您完成原始代码的一件事是,您在两个不同的级别上执行相同的foldLeft操作:首先在每个子列表上,然后在整个过程中。相反,您可以将集合flatten到一个大列表中,因此只需执行一次:
顺便说一句:这里有一种foldLeft方式:
docs.flatten.foldLeft(Map.empty[String,Int]){ case (z,x) => z.updated(x, z.getOrElse(x,0) + 1) }https://stackoverflow.com/questions/21466477
复制相似问题