Java 在一个窗口大小的周期内进行计数(例如 size=3)

标签 java java-stream

给定下面的类和数据结构,我想计算每个连续 3 个元素的计数总和,类似于以下结果:

public class SaleTxn {
    private int id;
    private String txnDate;
    private int amount;

}
数据如下
 id   txnDate        amount
    1    2018-10-10     100
    2    2018-10-11     200
    3    2018-10-12     100
    4    2018-10-13     100
    5    2018-10-14     200
    6    2018-10-15     200
    ... ...
并且窗口大小为 3,表示只是过去 3 个元素的总和,预期结果如下
2018-10-10 ~ 2018-10-12   Total: 100+200+100 = 400
2018-10-13 ~ 2018-10-14   Total: 100+200+200 = 500
...
我在下面有一个列表代码:
List<SaleTxn> myList; //
myList.stream().filter(x -> ??????)
                .mapToInt(SouthboundShareholding::getAmount)
                .sum();
我该如何实现?

最佳答案

我认为核心问题是分区列表,如果您可以使用Google Guava,这将非常简单,如下面的代码:
代码:

List<SaleTxn> saleTxns = new ArrayList<>();
saleTxns.add(new SaleTxn(1, "2018-10-10", 100));
saleTxns.add(new SaleTxn(2, "2018-10-11", 200));
saleTxns.add(new SaleTxn(3, "2018-10-12", 100));
saleTxns.add(new SaleTxn(4, "2018-10-13", 100));
saleTxns.add(new SaleTxn(5, "2018-10-14", 200));
saleTxns.add(new SaleTxn(6, "2018-10-15", 200));

// implement of filter
saleTxns = saleTxns.stream().filter(saleTxn -> true).collect(Collectors.toList());

// partition the list and sum all value
List<Integer> result = Lists.partition(saleTxns, 3).stream()
    .mapToInt(value -> value.stream().mapToInt(SaleTxn::getAmount).sum())
    .boxed()
    .collect(Collectors.toList());

System.out.println(result);
代码输出:
[400, 500]

关于Java 在一个窗口大小的周期内进行计数(例如 size=3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65716864/

相关文章:

java - 用于 GIS 目的的第三方库

java - 从 Gradle 添加 URL 到 BuildConfig 文件

java - 为什么更新/更快的 Java 8 排序方式更糟糕?

java - 使用 Java Stream - 独立处理流的两半

java - 使用 Java8 匹配方法比较两个列表

java - cloc,如何对结果求和?

java - 使用 Struts 2 xml 验证的自定义 validator 错误消息

java - 为什么 ScrollView 即使有要显示的文本也不会滚动

java - 如何使用流外的值创建带有 Java 流 API 的 map ?

Java 8流映射重用分配的变量