Java 8 流 : periodic sum on array

标签 java arrays indexing sum java-stream

我想对数组进行周期性求和,即对索引模 n 求和。

int size=100;
double[] doubleArr = new double[size];
for (int i = 0; i < size; i++){
    doubleArr[i]=Math.random();
}
int n=2;
double[] results= new double[n];
for (int i = 0; i < doubleArr.length; i++) {
    results[i % n] += doubleArr[i];
}
System.out.println(Arrays.toString(results));

这段代码可以工作,但是由于我的数组非常大,我想并行化该操作。

Java 8 流似乎是一个很好的解决方案。

double[] results2= new double[n];
IntStream.range(0, doubleArr.length).forEach(i -> results2[i % n] += doubleArr[i]);
System.out.println(Arrays.toString(results2));

我得到了相同的结果。很好。

但是如果我想要并行化,它就会失败。

double[] results3= new double[n];
IntStream.range(0, doubleArr.length).parallel().forEach(i ->     results3[i % n] += doubleArr[i]);
System.out.println(Arrays.toString(results3));

我明白这是因为 results3 是可变的。

我想我应该通过收集在流操作内生成结果,但我不知道如何继续。

最佳答案

您可以从可能的模数范围 (0..n) 开始:

double[] result = IntStream.range(0, n)
         .mapToDouble(i -> IntStream.rangeClosed(0, (size-i-1)/n)
                                    .mapToDouble(j -> doubleArr[j*n+i]).sum())
         .toArray();

如果n大于您拥有的核心数量,那么并行外部流就足够了。如果没有,请尝试并行化内部流。

关于Java 8 流 : periodic sum on array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35360491/

相关文章:

jQuery, 'undefined' 数组数组的长度?

ios - 在 firestore 索引中自动添加索引

indexing - 如何: Increase Lucene .净索引速度

java - 在 java 中创建样式 xml 以供查看(按钮)

java - jsp中的el表达式:invoke

java - 为什么这会给我带来堆栈溢出错误?

java - 如何找出哪个线程持有监视器?

C#按升序和降序对数组进行排序

c++ - 对数组中的整数进行排序。但它不适用于某些情况

sql-server - 具有多个 INCLUDE 列的单个索引或每个具有单个 INCLUDE 的多个索引