Scala与列表中当前和所有过去元素的部分和

时间:2015-03-24 07:28:18

标签: arrays scala sum

我们有一个整数列表,如:[1,4,5,6,6,7,9]

我们的想法是生成一个长度相同的列表,并总结到当前元素,如:[1,5,10,16,22,29,38]

在Java世界中,它看起来像:

int sum = 0;
int[] table = {1,4,5,6,6,7,9}
int[] res = new int[table.length]
for(int i=0; i<table.length; i++) {
  sum += table[i]
  res[i] = sum
}

我知道存在更优雅和有效的解决方案。我的问题是如何以更加功能的方式在Scala中做这样的事情?

THX!

2 个答案:

答案 0 :(得分:6)

您正在寻找扫描组合器。

List(1,4,5,6,6,7,9).scanLeft(0)(_ + _)
res1: List[Int] = List(0, 1, 5, 10, 16, 22, 29, 38)

如果您需要我不知道没有采用初始值的扫描版本,请删除带有尾部的前导元素。这个人的复杂性是O(n),你可以通过累加器和列表(包含过去的累加器)折叠列表来自己实现它。结果就是后者。

答案 1 :(得分:3)

@ uberwatch的答案是正确的,但为了完整起见,这是使用foldLeft的更“通用”的功能解决方案:

val xs = Vector(1,4,5,6,6,7,9)
val (sumList, sum) = 
  xs.foldLeft((Vector.empty[Int], 0)) {
    case ((list, total), x) => 
      val newTotal = x + total
      (list :+ newTotal, newTotal) 
  }
// sumList: Vector(1, 5, 10, 16, 22, 29, 38)
// sum: Int = 38