给定下面的类和数据结构,我想计算每个连续 3 个元素的计数总和,类似于以下结果:
public class SaleTxn {
private int id;
private String txnDate;
private int amount;
}
Run Code Online (Sandbox Code Playgroud)
数据如下
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
... ...
Run Code Online (Sandbox Code Playgroud)
并且窗口大小为 3,表示只是过去 3 个元素的总和,预期结果如下
2018-10-10 ~ 2018-10-12 Total: 100+200+100 = 400
2018-10-13 ~ 2018-10-14 Total: 100+200+200 = 500
...
Run Code Online (Sandbox Code Playgroud)
我在下面有一个列表代码:
List<SaleTxn> myList; //
myList.stream().filter(x -> ??????)
.mapToInt(SouthboundShareholding::getAmount)
.sum();
Run Code Online (Sandbox Code Playgroud)
我该如何实施?
我认为核心问题是分区列表,如果你可以使用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);
Run Code Online (Sandbox Code Playgroud)
代码的输出:
[400, 500]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |