【问题标题】:Transform a list List[String, String] into List[String, List[String]] in Scala?在 Scala 中将列表 List[String, String] 转换为 List[String, List[String]]?
【发布时间】:2012-06-13 05:40:18
【问题描述】:

我想获取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 中做到这一点?

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    这应该可行:

    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 不错的答案...只是提示:案例类不需要new
    • 阴影rawDocs也不理想。
    • @TravisBrown:是的,重构为更具描述性的名称
    • Big K 只是一个错字,但有两个答案是有启发性的。
    • 我更喜欢 DCS 的简洁回答,但这个回答更符合我期望遵循的心理过程。
    【解决方案2】:
    rawDocs.groupBy(_.title).mapValues(_ map (_.version)).map { 
      case (title, versions) => Doc(title, versions) 
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2016-07-21
      • 2020-04-01
      • 2021-01-13
      相关资源
      最近更新 更多