2012-06-11 9 views
3

Я хотел бы взять список RawDoc каждый из которых имеет title и один version и превратить его в список Doc которых каждый имеет title и все его versions, собранные вместе в список:Преобразовать список List [String, String] в список [String, List [String]] в Scala?

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")) 
) 

Без использования для петель, как это могло быть сделано в Scala?

ответ

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 Хороший ответ .. просто подсказка: вам не нужны 'new' для классов case – Kyle

+0

@Kyle: вы правы, спасибо, исправлено –

+1

Это также не идеально подходит для теневого' rawDocs'. –

4
rawDocs.groupBy(_.title).mapValues(_ map (_.version)).map { 
    case (title, versions) => Doc(title, versions) 
} 
Смежные вопросы