我有以下列表:
INPUT :: 4 5 8 -11 9 5 -7 4 6 -6 -8 -11 80 -32 -56 -15 5 -49
OUTPUT :: 4 9 17 6 15 20 13 17 23 17 9 -2 78 46 -10 -25 -20 -69
我需要计算累计总和-列表含义
T(n) = T(n) + T(n-1) for n >0;
and
T(0) = T(0)
我想使用Java流API进行计算,以便我可以使用Spark实现它以进行大数据计算。我在JavaStreams中很天真,我尝试了几个表达式,但没有一个是有效的,等效的结构代码应该是这样的:
int[] numbers = {4, 5, 8, -11, 9, 5, -7, 4, 6,-6, -8, -11, 80, -32, -56, -15, 5, -49};
int temp = 0;
for (int i = 0 ; i < numbers.length ; i++) {
temp = temp + numbers[i];
numbers[i] = temp;
}
您可以尝试使用自定义收集器。
public static void main(String[] args) {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> cumulatives = integers.stream().collect(CumulativeAdd.collector());
}
private static final class CumulativeAdd {
List<Integer> retArray= new ArrayList<>();
int sum = 0;
public void accept(Integer num) {
sum +=num;
retArray.add(sum);
}
public CumulativeAdd combine(CumulativeAdd other) {
throw new UnsupportedOperationException("Parallel Stream not supported");
}
public List<Integer> finish() {
return retArray;
}
public static Collector<Integer, ?, List<Integer>> collector() {
return Collector.of(CumulativeAdd::new, CumulativeAdd::accept, CumulativeAdd::combine, CumulativeAdd::finish);
}
}
这里有两种方法。
第一种方法效率很低,因为它基本上使用嵌套循环来累积值。第一个IntStream指定值的范围,嵌套的IntStream创建一个变量范围,并将值从0到该范围的末尾相加。
int[] result1 = IntStream.range(0, vals.length).map(
i -> IntStream.rangeClosed(0, i).map(k->vals[k]).reduce(0, (a, b) -> a + b))
.toArray();
这种方法更符合一种更为传统的方法。流式处理单个0数组,然后使用该数组来累加值的连续和。
int[] result2 = Stream.of(new int[] { 0 })
.flatMapToInt(k -> IntStream.of(vals).map(v -> {
k[0] += v;
return k[0];
})).toArray();
System.out.println(Arrays.toString(result1));
System.out.println(Arrays.toString(result2));
都有指纹
[4, 9, 17, 6, 15, 20, 13, 17, 23, 17, 9, -2, 78, 46, -10, -25, -20, -69]
[4, 9, 17, 6, 15, 20, 13, 17, 23, 17, 9, -2, 78, 46, -10, -25, -20, -69]
但你做得再好不过了。
for (int i = 1; i < vals.length; i++) {
vals[i] += vals[i-1];
}
底线是坚持你所拥有的。
试试这个。
int[] a = {4, 5, 8, -11, 9, 5, -7, 4, 6, -6, -8, -11, 80, -32, -56, -15, 5, -49};
Arrays.parallelPrefix(a, (x, y) -> x + y);
System.out.println(Arrays.toString(a));
输出:
[4, 9, 17, 6, 15, 20, 13, 17, 23, 17, 9, -2, 78, 46, -10, -25, -20, -69]
我们将以一个简单的问题开始,你已经知道如何不使用递归解决。 假设你想计算整数列表的总和,例如:[1,3,5,7,9]。 计算总和的迭代函数见ActiveCode 1。函数使用累加器变量(theSum)来计算列表中所有整数的和,从 0 开始,加上列表中的每个数字。 def listsum(numList): theSum = 0 for i in numList:
我试图实现列表中对象值的累积和。 对象如下所示: 我有一份清单 结果也应该是一个列表 如何使用Java流API实现它? 输入示例为: 所需输出为:
我想对一个整数列表求和。它的工作方式如下,但语法感觉不对。代码是否可以优化?
我有一个整数列表,比如list1,我想获得另一个列表list2,它将包含从开始到当前索引的累计总和。我如何使用流API Java8来实现这一点? 如何将上面的命令式代码更改为声明式代码?
问题内容: 假设我有一个Java IntStream,是否可以将其转换为具有累积总和的IntStream?例如,以[4、2、6,…]开头的流应转换为[4、6、12,…]。 更笼统地说,应该如何实施有状态流操作?感觉这应该可行: 有一个明显的限制,即它仅适用于顺序流。但是,Stream.map明确需要无状态映射函数。我是否错过了Stream.statefulMap或Stream.cumulative
假设我们有一个国家列表: