如何在Scala中累积2D数组元素?

时间:2018-10-28 02:42:37

标签: scala

我有以下二维数组: Array(Array(1,1,0), Array(1,0,1)) 我想在列上累积值,所以我的最终输出看起来像 Array(Array(1,1,0), Array(2,1,1))

如果这是一维数组,我可以简单地使用“扫描”,但是在二维数组中使用扫描时遇到麻烦。

有人可以帮助解决这个问题吗?

3 个答案:

答案 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或一维数组。这个想法本质上是相同的。

  1. 我们用 zero 初始化累加器。在这种情况下,零表示零数组。 Array.fill用于创建由零填充的数组。

  2. 我们需要逐个元素地添加数组,而不是单个添加。这就是zipmap的组合。互联网上有很多有关这些方法如何工作的示例。

  3. 最后,我们使用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

您可以将其改进为更容易记住,而不必重复对所有先前的行进行累加。