2014-01-30 11 views
0

我有一個文檔列表,我想查找所有文檔中的(term -> termCount)對。這裏是我正在做它:Scala foldLeft地圖和文檔的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) 

} 

OUTPUT:

Map(D -> 1, A -> 2, C -> 3, B -> 3) 

把它分解成操作,我在做什麼是:

  • 產生的(term, 1)

    元組
    val m = ts.map((_, 1)).groupBy(_._1) 
    
  • 計算文檔本地termCount e => e._1 -> e._2.foldLeft(0)(_ + _._2)

  • 生成文檔本地(term -> termCount)

  • 所有文檔壓扁這個地圖回元組(term, termCount)Map

  • 也再次做了foldLeft獲得全球termcounts

我的問題是,我怎樣才能讓這段代碼更簡潔?

回答

2

這是相當簡潔:

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收集到一個大名單,所以你只需要做一次:

BTW:這裏有一個foldLeft方式:

docs.flatten.foldLeft(Map.empty[String,Int]){ case (z,x) => z.updated(x, z.getOrElse(x,0) + 1) }