在scala中将两个列表的值的总和添加到新列表中

时间:2015-04-17 16:07:38

标签: list scala sum add

v1 = [1,2,3,4]
v2 = [1,2,3,4,5]

我需要这些列表的总和:[2,4,6,8,5]

有没有办法打印执行+ b = c的元素,其中c是例如8?

我如何在scala中执行此操作?

2 个答案:

答案 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的值。