Scala中数组的逐元素求和

10

我该如何计算数组的逐元素求和?

val a = new Array[Int](5)
val b = new Array[Int](5)
// assign values
// desired output: Array -> [a(0)+b(0), a(1)+b(1), a(2)+b(2), a(3)+b(3), a(4)+b(4)]

a.zip(b).flatMap(_._1+_._2)
缺失扩展函数的参数类型

5
应该这样写:a.zip(b).map(x => x._1 + x._2) - serejja
3个回答

21

尝试:

a.zip(b).map { case (x, y) => x + y }

16

当您在函数定义中使用下划线作为占位符时,它只能出现一次(对于每个函数参数位置而言,但在这种情况下 flatMap 接受一个 Function1,因此只有一个)。如果您需要多次引用同一个参数,则无法使用占位符语法,您需要为该参数命名。

正如其他答案所指出的,您可以使用.map { case (x, y) => x + y }或元组访问器版本,但还值得注意的是,如果您想避免在中间集合中产生大量元组分配,则可以编写以下内容:

scala> (a, b).zipped.map(_ + _)
res5: Array[Int] = Array(0, 0, 0, 0, 0)

在这里,zipped是一种可用于集合对的方法,具有特殊的map函数,它接受一个Function2,这意味着只创建了(a, b)对。在大多数情况下,额外的效率可能并不重要,但是可以传递Function2而不是对函数进行配对的语法通常更加优雅。


我一直认为“_”可以针对每个参数使用一次,而不是因为括号。原始示例中只有一个元组参数,编译器消息只是误导性的,或者它试图表达无法推断具有两个参数的函数的参数类型。a.zip(b).map((_:(Int, Int))._1 + (_:(Int, Int))._2) 显示了真正的错误(flatMap在这里不起作用,原因显而易见,返回类型错误)。我错了吗? - Victor Moroz
同时,这段代码(a.zip(b), a.zip(b)).zipped.map(_._1 + _._2)可以编译通过,而这段代码(a.zip(b), a.zip(b)).zipped.map(_._1.+(_._2))则不能,所以你关于括号的理解是正确的,只有在这种情况下,+不是一种语法糖,它的工作方式是不同的。 - Victor Moroz
@VictorMoroz 啊,谢谢你指出我的回答的第一部分没有关注这里最相关的信息。我刚刚更新了它。 - Travis Brown
Travis,你能详细解释一下 which means the only tuple that gets created is the (a, b) pair. 吗?(List(1), List(2)).zippedList(1).zip(List(2)) 有什么不同? - Kevin Meredith
2
@KevinMeredith,比较一下(0 to 1000).zip(0 to 1000).map(p => p._1 + p._2)(0 to 1000, 0 to 1000).zipped.map(_ + _)。第一个会创建一千个元组对象,而第二个只会创建一个。 - Travis Brown

-1
// one D Array    
val x = Array(1, 2, 3, 40, 55)    
val x1 = Array(1, 2, 3, 40, 55)    
x.indices.map(i=>x(i)+ x(i) )  

// TWo D Array    
val x1= Array((3,5), (5,7))    
val x = Array((1,2), (3,4))    
x.indices.map(i=>( x(i)._1 + x1(i)._1, x(i)._2 + x1(i)._2))

3
请帮助消除StackOverflow是免费编写代码服务的误解,通过为这个仅包含代码的答案添加一些解释来达成目标。(我没有点踩。) - Yunnosch
你的第一个例子忽略了x1数组,只是将x数组加倍。你的第二个例子不是一个二维数组,而只是一个元组的数组。 - jwvh

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