我有以下二维数组:
Array(Array(1,1,0), Array(1,0,1))
我想在列上累积值,所以我的最终输出看起来像
Array(Array(1,1,0), Array(2,1,1))
如果这是一维数组,我可以简单地使用“扫描”,但是在二维数组中使用扫描时遇到麻烦。
有人可以帮助解决这个问题吗?
答案 0 :(得分:0)
这里是一种方法:
val t = Array(Array(1,1,0), Array(1,0,1))
val result = t.scanLeft(Array.fill(t(0).length)(0)) ((x,y) =>
x.zip(y).map(e => e._1 + e._2)).drop(1)
//to see the results
result.foreach(e => println(e.toList))
给予:
List(1, 1, 0)
List(2, 1, 1)
这个想法是创建一个由零填充的数组(使用Array.fill),然后使用该数组作为累加器扫描2D数组。最后,drop(1)
摆脱了零填充的数组。
编辑:
根据评论,此解决方案适用于任何大小的矩阵。 zip
函数负责逐元素加法。
编辑2(逐步说明):
您已经了解scan
或一维数组。这个想法本质上是相同的。
我们用 zero 初始化累加器。在这种情况下,零表示零数组。 Array.fill
用于创建由零填充的数组。
我们需要逐个元素地添加数组,而不是单个添加。这就是zip
和map
的组合。互联网上有很多有关这些方法如何工作的示例。
最后,我们使用Scala的drop(1)
删除 zero 元素。结果是一个包含累积值的数组数组。
答案 1 :(得分:0)
与一维数组几乎相同的方法:
Iterator<String> itr = myStream.keySet().iterator();
while (itr.hasNext()) {
if (itr.next() != null) {
List<DS> values = myStream.get(itr.next());
Stream<Integer> lengthStream = values.stream().map(s -> s.getTransaction());
int sum = lengthStream.reduce(0, (x, y) -> x + y);
}
}
对于任意数字(只要它们都具有相同的数字):
a.tail.scan(a.head)((acc, value) =>
Array(acc(0) + value(0), acc(1) + value(1), acc(2) + value(2))
)
答案 2 :(得分:0)
对于给定的行r
,我将其求解,将所有先前的行相加。
val accumatedMatrix =
for(row <- array.indices)
yield array.take(row + 1).foldLeft(Array(0, 0, 0)) {
case (a, b) => Array(a(0) + b(0), a(1) + b(1), a(2) + b(2))
}
输入:
val array = Array(
Array(1,1,0),
Array(1,0,1)
)
输出:
1,1,0
2,1,1
您可以将其改进为更容易记住,而不必重复对所有先前的行进行累加。