在Scala中如何将一个列表List[String, String]转换为List[String, List[String]]?

3

我想将一个包含title和单个versionRawDoc列表转换为一个包含title和所有versionsDoc列表:

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中完成此操作?>
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))
  }

+1 很好的回答...只是一个提示:对于 case classes,你不需要使用 new - Kyle
1
阴影rawDocs也不是理想的选择。 - Travis Brown
@TravisBrown:已更改为更具描述性的名称。 - Tomasz Nurkiewicz
Big K只是一个打字错误,但有两个答案是有教育意义的。 - CW Holeman II
1
我更喜欢DCS的简洁回答,但这个更接近我预期的思维过程。 - CW Holeman II

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接