2012-06-11 147 views
3

我想借的RawDoc的列表,每個都有一個title和一個version並將其轉換成Doc每個列表有title及其所有versions一起收集到一個列表:將Scala中的List [String,String]變爲List [String,List [String]]?

case class RawDoc(title:String, version:String) 
case class Doc(title:String, versions:List[String]) 

val rawDocs:List[RawDoc] = List(
    RawDoc("Green Book", "1.1"), 
    RawDoc("Blue Book", "1.0"), 
    RawDoc("Green Book", "1"), 
    RawDoc("Blue Book", "2") 
) 

我想先從上述rawDocs創造docs這樣的:

val docs:List[Doc] = List(
    Doc("Green Book", List("1.1", "1")), 
    Doc("Blue Book", List("1.0", "2")) 
) 

不使用循環怎麼會這樣斯卡拉做?

回答

5

這應該工作:

val docs = rawDocs. 
    groupBy(_.title).map{ 
    case(title, docsWithSameTitle) => 
     Doc(title, docsWithSameTitle.map(_.version)) 
    } 

如果"Blue Book""Blue BooK"之間的差異並不是偶然的錯字,他們應該被視爲等於:

val docs = rawDocs. 
    groupBy(_.title.toUpperCase).map{ 
    case(_, docsWithSameTitle) => 
     Doc(docsWithSameTitle.head.title, docsWithSameTitle.map(_.version)) 
    } 
+0

+1尼斯答案.. 。只是一個提示:你不需要'新'的案例類 – Kyle

+0

@凱爾:你說得對,謝謝,修正 –

+1

陰影'rawDocs'也不是理想的。 –

4
rawDocs.groupBy(_.title).mapValues(_ map (_.version)).map { 
    case (title, versions) => Doc(title, versions) 
} 
相關問題