gpt4 book ai didi

Java 8,随时间间隔的复杂分组

转载 作者:可可西里 更新时间:2023-11-01 08:09:25 24 4
gpt4 key购买 nike

使用 Java 8 + JavaFX

我正在尝试进行一些数据分析并将结果输出到 XY 图表。我已经把我的图表摆正了,它接受这样的结构:

ObservableList<Data<Timestamp, BigDecimal>>

我的数据存储在自定义对象中,像这样

public class funds{
private long id;
private String userName;
private BigDecimal current;
private Timestamp createdAt;

....constructors/getters/setters....
}

一个 funds 对象通过一个重复的 Task 以 1 分钟的间隔为每个用户创建。

我想绘制所有 funds.current每小时平均总和图表。所以我通常会总结所有用户的每一分钟,然后计算每小时的平均值。在 MySQL 中我可以这样做:

SELECT FLOOR(UNIX_TIMESTAMP(created_at)/(60*60)) AS hour, AVG(current)
FROM (
SELECT FLOOR(UNIX_TIMESTAMP(created_at)/60) AS minute, SUM(current) as current, created_at
FROM funds
GROUP BY minute
) as table1
GROUP BY hour;

但在这种情况下,我没有直接的 SQL 访问权限,必须使用 java。我已经尝试查看流和 Collectors.groupingBy,但我无法充分考虑它以获得我想要的东西。

此外,Collectors 似乎没有任何与我需要的 BigDecimal 一起使用的函数,因为 double 对于财务数据来说非常糟糕。

谁能指出我正确的方向?

最佳答案

如果你真的不想使用 double ,试试这个:

Map<Long, BigDecimal> hourAverages = funds.stream()
//group by minute; as a result we have Map<Long, BigDecimal>
.collect(toMap(f -> f.createdAt.getTime() / 6000, f -> f.current, BigDecimal::add))
.entrySet().stream()
//group by hours; here we use BigDecimal[] to store sum and count;
//as a result we have Map<Long, BigDecimal[]>
.collect(groupingBy(e -> e.getKey() / 60,
collectingAndThen(
reducing(new BigDecimal[] {BigDecimal.ZERO, BigDecimal.ZERO},
e -> new BigDecimal[]{e.getValue(), BigDecimal.ONE},
(a, b) -> new BigDecimal[]{a[0].add(b[0]), a[1].add(b[1])}),
//finally divide by count
a -> a[0].divide(a[1], BigDecimal.ROUND_UP))));

关于Java 8,随时间间隔的复杂分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47521892/

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