Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java n小时分组_Java_Date_Java 8_Grouping - Fatal编程技术网

Java n小时分组

Java n小时分组,java,date,java-8,grouping,Java,Date,Java 8,Grouping,我有一个带有LocalDateTime字段(controlDate)和int(orders)字段以及其他字段的JavaPOJO,但与我的问题无关 我正在从数据库中获取此POJO的列表,例如: controlDate orders 2018-10-07 23:26:00.000+02 5 2018-10-07 23:27:00.000+02 2 2018-10-07 18:33:00.000+02 8 2018-10-07 18:35:00.000+02 4

我有一个带有LocalDateTime字段(controlDate)和int(orders)字段以及其他字段的JavaPOJO,但与我的问题无关

我正在从数据库中获取此POJO的列表,例如:

controlDate                 orders
2018-10-07 23:26:00.000+02  5
2018-10-07 23:27:00.000+02  2
2018-10-07 18:33:00.000+02  8
2018-10-07 18:35:00.000+02  4
我的最终目标是通过n小时的数据包(并将最早的日期保留为已放弃的日期)和“订单”列的平均值来放弃数据

例如,如果值为n=2,我希望得到如下结果:

controlDate                 orders
2018-10-07 23:26:00.000+02  3 (or 4, I don't really care about the rounding)
2018-10-07 18:33:00.000+02  6
我很确定使用Java8流我可以实现这一点,可能是使用Collectors.groupingBy,但我不知道如何才能实现这一点


谢谢你的帮助

这段代码应该可以做到:

class Delivery {
    LocalDateTime timestamp;
    Integer packages;

    public Delivery(LocalDateTime timestamp, Integer packages) {
        this.timestamp = timestamp;
        this.packages = packages;
    }


    public Integer getPackages() {
        return packages;
    }

    public LocalDate getDate() {
        return timestamp.toLocalDate();
    }

    public Integer getHour() {
        return timestamp.getHour();
    }

}

public class Calculate {

    public static void main(final String[] args) {
        Stream<Delivery> deliveries = Stream.of(
                new Delivery(LocalDateTime.of(2018, 10, 7, 23, 26), 5),
                new Delivery(LocalDateTime.of(2018, 10, 7, 23, 27), 2),
                new Delivery(LocalDateTime.of(2018, 10, 7, 18, 33), 8),
                new Delivery(LocalDateTime.of(2018, 10, 7, 18, 35), 4)
        );

        deliveries.map(delivery -> {
            Map r = new HashMap();
            r.put(delivery.getHour(), delivery.getPackages());
            return r;
        }).collect(Collectors.groupingBy(d -> d.keySet().toArray()[0])).forEach((o, packages) -> {
            System.out.print(o + ":");
            Integer sum = (Integer) packages.stream().map(map -> map.get(o)).reduce(0, (a, b) -> (Integer) a + (Integer) b);
            long count = packages.stream().count();
            System.out.println(sum / count);
        });
    }
}

它是按小时排序的,因此您可以扩展此解决方案以满足您的需要。

SQL具有一些非常强大的分组功能(请参见
groupby
HAVING
)。这可能更合适,并为您节省一些Java编码。嗨,Dave,事实上,我的第一个方法是在SQL中完成,我使用Hibernate本机查询成功地实现了MySQL SGBD。现在我必须迁移到PostgreSQL,因此我必须编写一个全新的本机查询。我意识到这不是最好的方法(如果tommorow我要迁移到Oracle或另一个SGBD呢?),这就是为什么我试图将agregation部分委托给Java代码,使其独立于SGBD。我试图查看Hibernate文档,但除了一个本地的queryFair之外,我没有找到任何可以实现我想要做的事情。在这种情况下,按照SO的方式,您可能应该向我们展示到目前为止您拥有的代码。这些时间戳有一个与UTC的偏移量,这意味着它们代表一个时刻,时间线上的一个特定点。在这种情况下,
LocalDateTime
使用的类是错误的,因为该类不能代表一个时刻。改为使用
OffsetDateTime
。据我所知,流不适合在组中第一次分组,如您的示例结果所示。如果按整小时分组是可以的(如到目前为止发布的第一个答案),则流可能是可以的
18:6
23:3