列表中当前和所有过去元素的 Scala 部分求和
Scala partial sum with current and all past elements in the list
我们有一个整数列表,例如:[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 中做这样的事情?
谢谢!
您正在寻找扫描组合器。
List(1,4,5,6,6,7,9).scanLeft(0)(_ + _)
res1: List[Int] = List(0, 1, 5, 10, 16, 22, 29, 38)
如果需要,请删除带有尾部的前导元素我不知道不采用初始值的扫描版本。对于这个人来说,复杂度是 O(n),您可以通过累加器和列表(包含过去的累加器)折叠列表来自己实现它。结果是后者。
@uberwatch 的回答是正确的,但为了完整起见,这里有更多 "generic" 功能解决方案,使用 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
我们有一个整数列表,例如:[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 中做这样的事情?
谢谢!
您正在寻找扫描组合器。
List(1,4,5,6,6,7,9).scanLeft(0)(_ + _)
res1: List[Int] = List(0, 1, 5, 10, 16, 22, 29, 38)
如果需要,请删除带有尾部的前导元素我不知道不采用初始值的扫描版本。对于这个人来说,复杂度是 O(n),您可以通过累加器和列表(包含过去的累加器)折叠列表来自己实现它。结果是后者。
@uberwatch 的回答是正确的,但为了完整起见,这里有更多 "generic" 功能解决方案,使用 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