使用Java进行滑动窗口处理
动机
我想在Java中实现常用于时间序列处理的滑动窗口处理。在SQL中,大部分实现都有窗口函数,所以不需要担心,但是在Java中没有,因此我写下了这篇文章。
在StackOverflow上有代码,但是它要么使用List存储数据,要么使用库。
借用一下你的话,大致上是这样的感觉。
public static Stream<List> 滑动窗口(List 列表, int 大小) {
if(大小 > 列表.size())
return Stream.empty();
return IntStream.range(0, 列表.size()-大小+1)
.mapToObj(起始位置 -> 列表.subList(起始位置, 起始位置+大小));
}
这段代码我唯一不喜欢的地方就是参数是一个列表。这样会导致内存消耗增大的情况。
代码 (Mandarin:
我毫不费力地直接改写了它。
public static <T> void sliding(Stream<T> stream, int size, Consumer<List<T>> consumer) {
Iterator<T> itr = stream.iterator();
List<T> buffer = new LinkedList<T>();
while (itr.hasNext()) {
buffer.add(itr.next());
if (buffer.size() > size)
buffer.remove(0);
consumer.accept(buffer);
}
}
请确认动作
以下是对调用的一个例子的感觉。
sliding(Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 3, System.out::println);
执行结果
以上的執行結果大致如下。
[0]
[0, 1]
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
[8, 9, 10]
请参考以下资源。
请参阅下列资料。
请参考下列参考资料。
请查看以下资源。
请参考下面的资料。
如何将Java流转换为滑动窗口?