我有以下对象的 ArraList:
public class Point {
private double[] position; // hold x y z coordinate
private double[] velocity; // hold velocity vector
private double value; // some value
/*
* setters, geters another calculations ...
*/
}
我需要根据 Point.position[0] 将这些点分成 10 个区域。在每个区域,我想计算平均速度并找出位置的最小值/最大值[2]。
那么分区的宽度是多少:
body = new ArrayList<>(); // array of points, filled from file
DoubleSummaryStatistics ds = body.parallelStream().mapToDouble(Point::x).summaryStatistics();
step = (ds.getMax() - ds.getMin()) / 10; // let's say I want 10 subareas
from = ds.getMin();
to = from + krok;
我的想法是循环过滤点并进行统计
List<Point> subArea;
for (int i = 0; i < kolkoUsekov; i++) {
subArea = body.parallelStream().filter(b -> from<=b.y && b.y<to).collect(Collectors.toList());
// do statistics
// #1
subArea.forEach(...);
// or #2
DoubleSummaryStatistics ds = subArea.parallelStream().mapToDouble(Point::z).summaryStatistics();
ds = subArea.parallelStream().mapToDouble(Point::velocityX).summaryStatistics();
ds = subArea.parallelStream().mapToDouble(Point::velocityY).summaryStatistics();
ds = subArea.parallelStream().mapToDouble(Point::velocityZ).summaryStatistics();
/* ... */
// print statistics
from += krok;
to += krok;
}
问题:
- 在 lambda 中,我必须有 Final,而我的变量 FROM、TO 则不是
- 我将在分区上循环 4 次,以在选项 #2 中查找完整的统计信息
非常感谢您帮助我进行过滤并找到一些快速统计的好主意
最佳答案
我确实发现这很有帮助http://www.oracle.com/technetwork/articles/java/architect-streams-pt2-2227132.html
所以我确实在点对象中创建了新方法
public Integer whichPart(double min, double step, int axe) {
return new Integer((int) ((position[axe] - min) / step));
}
稍后,准备一些数据
ds = body.parallelStream().mapToDouble(Bod::y).summaryStatistics();
min = ds.getMin();
step = (ds.getMax() - min) / 12; // I want 12 subareas
然后分组
Map<Integer, List<Bod>> rozdeleneBody = body.parallelStream()
.collect(Collectors.groupingBy(b->b.whichPart(min,step,1)));
现在也许我会循环分组列表或者创建自定义收集器
关于java - 使用java 8 Stream分割ArrayList并进行统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42764827/