gpt4 book ai didi

java - 按 n 小时的数据包分组

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:46:33 26 4
gpt4 key购买 nike

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

我正在从我的数据库中获取此 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

我很确定使用 Java 8 流我可以实现这一点,可能使用 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);
});
}
}

你会得到:

18:6
23:3

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

关于java - 按 n 小时的数据包分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52693735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com