如何在Scala中合并两个列表?

5
我们有两个列表:
val a:List[(String, Int, Int)] = List(("apple", 3, 25),("orange", 4, 47))

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

如何最好地将a和b连接起来以获得:

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

你尝试过以下方法吗:1. map到map 2. 合并maps - Dawid Pura
没有尝试合并地图。 - GKVM
2
你能否更新你的代码,使其在Scala中真正编译通过吗? - Łukasz
当询问问题时,请务必提供一个能编译并清晰显示您意图的代码。从上面的代码片段中很难确定您是否实际上有一个 Map 还是一个 List - 4lex1v
List[String, Int, String] 不是有效的,但 List[(String, Int, String)] 是有效的。 - GKVM
显示剩余3条评论
3个回答

11

遍历第一个列表,并在映射表mb中查找第二个列表的值。如果 .get 返回 None,则使用.flatMap删除该项。

 val mb = b.toMap

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

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

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

那不是楼主想要的输出。而且,如果任一列表中有重复的键,则会执行不同的操作。 - The Archetypal Paul

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

错误。这不会产生OP所请求的结果。 - jwvh

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