首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8在一段时间内的滑动窗口计数

Java 8在一段时间内的滑动窗口计数
EN

Stack Overflow用户
提问于 2019-03-09 07:14:46
回答 1查看 782关注 0票数 2

给定下面的类和数据结构,我想要计算每个连续3小时滑动窗口的计数总和,类似于以下结果:

代码语言:javascript
复制
public class Log {
    private int id;
    private LocalDateTime timestamp;
    private int count;
}
代码语言:javascript
复制
id   timestamp               count
1    2018-10-10T08:00:00     12
2    2018-10-10T08:30:00     5
3    2018-10-10T08:45:00     7
4    2018-10-10T09:10:00     9
5    2018-10-10T09:50:00     3
6    2018-10-10T10:15:00     8
7    2018-10-10T12:00:00     6
8    2018-10-10T12:30:00     1
9    2018-10-10T12:45:00     2
10   2018-10-10T17:30:00     4
11   2018-10-10T17:35:00     7

日志的时间戳是升序的,从第一条记录算起每3小时窗口(可以跨越不同的一天)的计数总和。结果将是:

代码语言:javascript
复制
2018-10-10T08:00:00 ~ 2018-10-10T10:59:00   12+5+7+9+3+8
2018-10-10T08:30:00 ~ 2018-10-10T11:29:00   5+7+9+3+8
2018-10-10T08:45:00 ~ 2018-10-10T11:44:00   7+9+3+8
2018-10-10T09:10:00 ~ 2018-10-10T12:09:00   9+3+8+6
2018-10-10T09:50:00 ~ 2018-10-10T12:09:00   3+8+6+1
2018-10-10T10:15:00 ~ 2018-10-10T13:14:00   8+6+1+2
...

我有一些下面的示例代码,但我觉得效率不是很高(如果有大量的日志),因为每次我都必须从所有日志中获取并比较过滤后的时间戳。我怎么能只比较从当前日志到日志结束?

代码语言:javascript
复制
var logs = List.of();
logs.stream.map(log -> {
    var start = log.getTimeStamp();
    var end = log.getTimeStamp().plusHours(3);
    var logsWithinWindow = logs.stream().filter(l -> isWithinRange(start, end, l.getTimeStamp()));
    return logsWithinWindow.map(Log::getCount).sum();
});
EN

回答 1

Stack Overflow用户

发布于 2019-03-09 11:33:24

如果您要计算任意持续时间内的日志,您可以使用:

代码语言:javascript
复制
int countLogsInDuration(List<Log> logs, LocalDateTime start, LocalDateTime end) {
    return logs.stream()
            .filter(log -> isWithinRange(log.getTimeStamp(), start, end))
            .mapToInt(Log::getCount)
            .sum();
}

它依赖于

代码语言:javascript
复制
private static boolean isWithinRange(LocalDateTime logTimestamp, LocalDateTime start, LocalDateTime end) {
    // return true or false based on comparison
}

此外,至少在你的情况下,计算每3小时窗口的日志似乎是多余的,因为你的滑动窗口大小是30分钟。因此,您可以计算每30分钟的计数,例如8:00到8:30,然后是8:30到9:00,依此类推。当你的滑动窗口与之前的持续时间重叠时,这将避免重复计算计数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55072300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档