我该如何计算数组的逐元素求和?
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)
缺失扩展函数的参数类型
尝试:
a.zip(b).map { case (x, y) => x + y }
当您在函数定义中使用下划线作为占位符时,它只能出现一次(对于每个函数参数位置而言,但在这种情况下 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 Morozwhich means the only tuple that gets created is the (a, b) pair.
吗?(List(1), List(2)).zipped
和 List(1).zip(List(2))
有什么不同? - Kevin Meredith(0 to 1000).zip(0 to 1000).map(p => p._1 + p._2)
和(0 to 1000, 0 to 1000).zipped.map(_ + _)
。第一个会创建一千个元组对象,而第二个只会创建一个。 - Travis Brown// 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))
x1
数组,只是将x
数组加倍。你的第二个例子不是一个二维数组,而只是一个元组的数组。 - jwvh
a.zip(b).map(x => x._1 + x._2)
。 - serejja