2014-01-30 1 views
0

문서 목록이 있으며 모든 문서에 대해 (term -> termCount) 쌍을 찾고 싶습니다. 여기에 내가 그 일을하고 어떻게 :Scala foldLeft map 및 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)

  • 생성 튜플

    val m = ts.map((_, 1)).groupBy(_._1) 
    
  • 문서 로컬 termCount e => e._1 -> e._2.foldLeft(0)(_ + _._2)

  • 생성을 계산하는 모든 문서에 걸쳐 튜플 (term, termCount) 다시이지도를 병합 문서 현지 (term -> termCount) 항목

  • Map

  • 는 다시 글로벌 얻기 위해 foldLeft을하고

  • 임기도

, 어떻게이 코드를 더 간결하게 만들 수 있습니까?

답변

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는

:

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