【问题标题】:How to join two lists in Scala?如何在 Scala 中加入两个列表?
【发布时间】:2016-02-16 12:56:21
【问题描述】:

我们有两个列表:

val a:List[(String, Int, Int)] = List(("apple", 3, 25),("orange", 4, 47))

val b:List[(String, String)] = List(("mango", "25"),("orange", "50"))

Join a 和 b 的最佳方法是:

val c : List[(String, Int, Int, String)] = List(("orange", 4, 47, "50"))

【问题讨论】:

  • 你试过了吗:1.地图到地图2.加入地图
  • 没有尝试加入地图。
  • 你能更新你的代码以在 scala 中实际编译吗?
  • 在提出问题时,请注意提供可编译并清楚表明您的意图的代码。从上面的 sn-p 很难说你到底有一个 Map 还是一个 List
  • @Łukasz 更新了工作代码。

标签: list scala dictionary


【解决方案1】:

遍历第一个列表并在映射mb 中查找第二个列表的值。如果.get 返回None.flatMap 会使条目消失。

 val mb = b.toMap

 a.flatMap{case (ka,va,vva) => mb.get(ka).map(vb => (ka,va,vva,vb))}

【讨论】:

  • @GKVM 查看我添加的 REPL 会话。它完全符合您的要求。当然,除非您没有提供所有必需的规格。想详细说明问题所在?
  • @GKVM 我已经更新了我的代码。但是旧答案对于旧问题是正确的,并且更新问题的答案可以从旧答案中轻松推导出来。您违反了 SO 的两条规则:1)不要将问题更改为不同的内容,以及 2)问一个最小/最一般的问题。旧问题更笼统,包含您所面临问题的核心;更好。
【解决方案2】:

您可以连接列表,然后按元组的第一个元素对它们进行分组:

val groupedTuples: Map[String, List[(String, String)]] = (a ++ b).groupBy(_._1)
val c: Map[String, List[String]] =  groupedTuples.mapValues(_.map(_._2))

这将导致

Map(mango -> List(25), orange -> List(4, 50), apple -> List(3))

【讨论】:

  • 这不是 OP 想要的输出。此外,如果任一列表中有重复的键,它会做一些不同的事情。
【解决方案3】:

如果l1l2 是两个列表:l1:::l2

【讨论】:

  • 错了。这不会产生 OP 要求的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2023-03-10
  • 2020-03-05
  • 2016-02-25
  • 1970-01-01
  • 2014-11-22
  • 2019-03-17
相关资源
最近更新 更多