【问题标题】:split ArrayList and make statistics using java 8 Stream拆分 ArrayList 并使用 java 8 Stream 进行统计
【发布时间】:2017-08-03 12:57:06
【问题描述】:

我有以下对象的 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 中,我必须有最终变量,而我的变量 FROM、TO 不是
- 我将在分区上循环 4 次以在选项 #2 中找到完整的统计信息

非常感谢您帮助我过滤并找到一些快速统计的好主意

【问题讨论】:

    标签: java filter java-8 statistics java-stream


    【解决方案1】:

    我确实觉得这很有帮助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)));
    

    现在也许我会遍历分组列表,或者我会创建自定义收集器

    【讨论】:

    • 不需要new Integer(…)。而且双括号比单括号没有优势……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多