3

我想列出一个列表RawDoc,每个列表都有一个title和一个version,并将其转换为一个列表Doc,每个列表都有一个title,并且所有这些都versions收集到一个列表中:

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 回答