v1 = [1,2,3,4]
v2 = [1,2,3,4,5]
我需要这些列表的总和:[2,4,6,8,5]
有没有办法打印执行+ b = c的元素,其中c是例如8?
我如何在scala中执行此操作?
答案 0 :(得分:5)
您可以使用zipAll
将列表压缩在一起。该方法接受两个额外的参数,这些参数表示在一个列表比另一个列表长的情况下使用的元素,反之亦然。由于您要添加列表,因此应使用附加标识0.然后,您只需map
生成生成的元组列表:
val v1 = List(1, 2, 3, 4)
val v2 = List(1, 2, 3, 4, 5)
v1.zipAll(v2, 0, 0).map { case (a, b) => a + b }
您可以在IterableLike
的文档中阅读zipAll
的文档。最相关的部分:
通过成对组合相应的元素,返回由此可迭代集合和另一个可迭代集合形成的可迭代集合。如果两个集合中的一个比另一个集合短,则使用占位符元素将较短的集合扩展为较长的集合。
如果您打算打印出某些元素,可以选择filter
代替map
,然后使用foreach
:
v1.zipAll(v2, 0, 0).filter {
case(a, b) => a + b == 8
}.foreach {
case(a, b) => println(s"$a+$b=8")
}
或者只是foreach
包含更多有趣的case
语句:
v1.zipAll(v2, 0, 0).foreach {
case(a, b) if a + b == 8 => println(s"$a+$b=8")
case _ =>
}
或者您可以使用collect
,并忽略返回值:
v1.zipAll(v2, 0, 0).collect {
case(a, b) if a + b == 8 => println(s"$a+$b=8")
}
您可能希望阅读一些Scala集合库的介绍性文本,例如docs中的文本。
答案 1 :(得分:0)
与Ben的类似方法,使用for comprehension,
for ( (a,b) <- v1.zipAll(v2, 0, 0) if a+b == 8 ) yield (a,b)
提供那些(压缩)值为8的值。