Scala 使用相同的键组合两个列表

Scala 使用相同的键组合两个列表,scala,Scala,下面是一个非常简单的请求,可以将以下两个列表合并: scala> list1 res17: List[(Int, Double)] = List((1,0.1), (2,0.2), (3,0.3), (4,0.4)) scala> list2 res18: List[(Int, String)] = List((1,aaa), (2,bbb), (3,ccc), (4,ddd)) 所需输出如下: ((aaa,0.1),(bbb,0.2),(ccc,0.3),(ddd,0.4))

下面是一个非常简单的请求,可以将以下两个列表合并:

scala> list1
res17: List[(Int, Double)] = List((1,0.1), (2,0.2), (3,0.3), (4,0.4))

scala> list2 
res18: List[(Int, String)] = List((1,aaa), (2,bbb), (3,ccc), (4,ddd))
所需输出如下:

((aaa,0.1),(bbb,0.2),(ccc,0.3),(ddd,0.4))
我试过:

scala> (list1 ++ list2)
res23: List[(Int, Any)] = List((1,0.1), (2,0.2), (3,0.3), (4,0.4), 
(1,aaa), (2,bbb), (3,ccc), (4,ddd))
但是:

scala>(list1++list2).groupByKey
:10:错误:值groupByKey不是列表[(Int,
(列表1++列表2).groupByKey

有什么提示吗?谢谢

您正在寻找的方法是:

如果您知道每个键正好有两个值,则可以将它们合并:

scala> val pairs = List((1, "a1"), (2, "b1"), (1, "a2"), (2, "b2"))
pairs: List[(Int, String)] = List((1,a1), (2,b1), (1,a2), (2,b2))

scala> pairs.groupBy(_._1).values.map {
     |   case List((_, v1), (_, v2)) => (v1, v2)
     | }
res0: Iterable[(String, String)] = List((b1,b2), (a1,a2)) 
如果两个列表以相同的顺序包含相同的键,则可以使用
zip

scala> val l1 = List((1, "a1"), (2, "b1"))
l1: List[(Int, String)] = List((1,a1), (2,b1))

scala> val l2 = List((1, "a2"), (2, "b2"))
l2: List[(Int, String)] = List((1,a2), (2,b2))

scala> l1.zip(l2).map { case ((_, v1), (_, v2)) => (v1, v2) }
res1: List[(String, String)] = List((a1,a2), (b1,b2))

这里有一个简单的例子:

scala> list2.map(_._2) zip list1.map(_._2)
res0: List[(String, Double)] = List((aaa,0.1), (bbb,0.2), (ccc,0.3), (ddd,0.4))
如果你不确定为什么会这样,请继续阅读!我将逐步展开它:

list2.map(<function>)
因此,我们需要的是一个函数文本,它接受一个参数(列表中的当前值)并返回第二个元组值(
\u 2
)。我们可以这样编写函数文字:

list2.map(item => item._2)
我们不需要为
item
指定类型,因为编译器非常聪明,可以通过目标类型来推断它。一个非常有用的快捷方式是,我们可以完全省略
,并用一个下划线
\uu
替换它。因此,它被简化(或加密,取决于您的查看方式)为:

关于这一行程序的另一个有趣的部分是
zip
方法。zip所做的一切就是把两个列表合并成一个列表,就像你最喜欢的连帽衫上的拉链一样

val a = List("a", "b", "c")
val b = List(1, 2, 3)

a zip b     // returns ((a,1), (b,2), (c,3))

干杯

@user1460691不客气。请随意接受两个答案中的一个来结束这个问题。这并不是根据关键字来组合列表,而是根据索引来组合列表,在OPs示例中,索引恰好与索引相对应。我相信这个答案更准确地回答了问题的精神
val myTuple = (1.0, "hello")   // A Tuple2
println(myTuple._1)            // prints "1.0"
println(myTuple._2)            // prints "hello"
list2.map(item => item._2)
list2.map(_._2)
val a = List("a", "b", "c")
val b = List(1, 2, 3)

a zip b     // returns ((a,1), (b,2), (c,3))