java - 使用java 8 Stream分割ArrayList并进行统计

标签 java filter java-8 statistics java-stream

我有以下对象的 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/

相关文章:

Java模块和Cycle存在模块依赖关系,Module

Django 对象过滤器(最后 1000 个)

python - 使用过滤后的行创建新的数据框

java - 将第一个映射的键映射到第二个映射的值的有效方法,其中第一个映射的值是第二个映射的键

java - dao层的多个方法

java - Spring 数据 REST findBy 嵌套实体

java - Elasticsearch 多个字段的通配符搜索

java - Java版本之间的不兼容性

java - 使用 Java 8 转换类

java - mysql第一次完美连接,第二次返回空指针