我有一张包含每日数据的 LocalDate
和 Integer 的 map 。现在我想用每周数据创建一个新 map ,这意味着新 map 将包含当我们总结前一个条目和当前条目下的整数时的累积计数。我被困在这个。谁能帮我设计一个算法。我是 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());
}
}
}
}
最佳答案
似乎最简单的方法是首先构建一个累积总和的日图,然后仅过滤掉星期一:
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));
}
编辑:
如果你想保留结果 map 的顺序,你可以修改最后的collect()
调用:
.collect(Collectors.toMap(
Map.Entry::getKey, Map.Entry::getValue,
(v1, v2) -> { throw new RuntimeException("Duplicate key - can't happen"); },
TreeMap::new));
关于java - 在 Java 中将 map 从每日数据转换为每周数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52641585/