3

RawDocそれぞれが atitleと singleを持つリストを取得し、それをそれぞれが aとそのすべてをまとめてリストversionにまとめたリストに変換したいと思います。Doctitleversions

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

for ループを使用せずに、Scala でこれを行うにはどうすればよいでしょうか?

4

2 に答える 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))
  }
于 2012-06-11T19:37:24.807 に答える
4
rawDocs.groupBy(_.title).mapValues(_ map (_.version)).map { 
  case (title, versions) => Doc(title, versions) 
}
于 2012-06-11T20:48:51.383 に答える