【发布时间】:2015-04-17 16:07:37
【问题描述】:
v1 = [1,2,3,4]
v2 = [1,2,3,4,5]
我需要这些列表的总和:[2,4,6,8,5]
有没有办法打印执行 a+b= c 的元素,其中 c 是例如 8 ?
我怎样才能在 scala 中做到这一点?
【问题讨论】:
v1 = [1,2,3,4]
v2 = [1,2,3,4,5]
我需要这些列表的总和:[2,4,6,8,5]
有没有办法打印执行 a+b= c 的元素,其中 c 是例如 8 ?
我怎样才能在 scala 中做到这一点?
【问题讨论】:
您可以使用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 中的文字。
【讨论】:
类似于 Ben 的方法,使用 for 理解,
for ( (a,b) <- v1.zipAll(v2, 0, 0) if a+b == 8 ) yield (a,b)
提供总和为 8 的那些(压缩)值对。
【讨论】: