我有一个LocalDate
和Integer的映射以及每日数据。现在,我想使用每周数据创建一个新地图,这意味着当我们对落在上一个条目和当前条目下的整数求和时,新地图将包含累积计数。我陷入了困境。谁能帮我设计一个算法。我是Java Stream api的新手,如果可以使用Stream API做到这一点
示例数据:
在图像中,我尝试遍历weeklyMap,然后在其中遍历dailyMap。但是我不确定如何在代码(Java)中实现它。
编辑
代码段:
Map.Entry<LocalDate, Integer> prevEntry = null;
boolean firstTime = true;
for (Map.Entry<LocalDate, Integer> currEntry : weeklyMap.entrySet()) {
if (firstTime) {
prevEntry = currEntry;
firstTime = false;
if (weeklyMap.containsKey(currEntry.getKey())) {
weeklyMap.put(currEntry.getKey(), currEntry.getValue());
}
} else {
for (Map.Entry<LocalDate, Integer> todayEntry : dailyMap.entrySet()) {
if (prevEntry.getKey().equals(todayEntry.getKey())) {
prevEntry.setValue(todayEntry.getValue());
} else if(todayEntry.getKey().isAfter(prevEntry.getKey()) && todayEntry.getKey().isBefore(currEntry.getKey())) {
currEntry.setValue(currEntry.getValue() + todayEntry.getValue());
}
}
}
}
答案 0 :(得分:1)
最简单的方法是首先建立每日累积金额的地图,然后仅过滤星期一:
public static Map<LocalDate, Integer> cumulativeWeeklySum(SortedMap<LocalDate, Integer> data) {
AtomicInteger cumulativeSum = new AtomicInteger(0);
return data.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> cumulativeSum.addAndGet(e.getValue())))
.entrySet().stream()
.filter(e -> e.getKey().getDayOfWeek() == DayOfWeek.MONDAY || e.getKey().equals(data.lastKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
编辑:
如果您想保留生成的地图的顺序,则可以修改最近的collect()
调用:
.collect(Collectors.toMap(
Map.Entry::getKey, Map.Entry::getValue,
(v1, v2) -> { throw new RuntimeException("Duplicate key - can't happen"); },
TreeMap::new));
答案 1 :(得分:0)
我认为您应该包括验证currentEntry.key == todayEntry.key
的小写情况,然后对先前的值求和。
代码可能看起来像这样:
if(todayEntry.getKey().equals(currEntry.getKey())) {
currEntry.setValue(currEntry.getValue() + todayEntry.getValue() + prevEntry.getValue());
}