Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/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 8在滑动窗口期间计数_Java_Logging_Java Stream_Java 10 - Fatal编程技术网

Java 8在滑动窗口期间计数

Java 8在滑动窗口期间计数,java,logging,java-stream,java-10,Java,Logging,Java Stream,Java 10,鉴于下面的类和数据结构,我想计算每个连续3小时滑动窗口的计数总和,类似于以下结果: public class Log { private int id; private LocalDateTime timestamp; private int count; } 日志的时间戳按升序排列,并从第一条记录开始计算每3小时窗口(可以跨越不同的日期)的总计数。 结果将是: 2018-10-10T08:00:00 ~ 2018-10-10T10:59:00 12+5+7+9+3

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

public class Log {
    private int id;
    private LocalDateTime timestamp;
    private int count;
}
日志的时间戳按升序排列,并从第一条记录开始计算每3小时窗口(可以跨越不同的日期)的总计数。 结果将是:

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
...
我在下面有一些示例代码,但感觉效率不高(如果有大量日志),因为每次我都必须从所有日志中获取并比较过滤后的时间戳。我怎样才能从当前日志中比较到最后

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();
});

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

int countLogsInDuration(List<Log> logs, LocalDateTime start, LocalDateTime end) {
    return logs.stream()
            .filter(log -> isWithinRange(log.getTimeStamp(), start, end))
            .mapToInt(Log::getCount)
            .sum();
}
此外,至少在您的情况下,每3小时计算一次日志似乎是多余的,因为滑动窗口的大小是30分钟。因此,您可以每30分钟计算一次计数,例如8:00到8:30,然后8:30到9:00等等。这将避免在滑动窗口与上一个持续时间重叠时重复计算计数

我怎样才能从当前日志中比较到最后。。。仍然不清楚您想要比较什么?
int countLogsInDuration(List<Log> logs, LocalDateTime start, LocalDateTime end) {
    return logs.stream()
            .filter(log -> isWithinRange(log.getTimeStamp(), start, end))
            .mapToInt(Log::getCount)
            .sum();
}
private static boolean isWithinRange(LocalDateTime logTimestamp, LocalDateTime start, LocalDateTime end) {
    // return true or false based on comparison
}