使用Java将地图从每日数据转换为每周数据

时间:2018-10-04 07:46:22

标签: java algorithm java-stream treemap

我有一个LocalDate和Integer的映射以及每日数据。现在,我想使用每周数据创建一个新地图,这意味着当我们对落在上一个条目和当前条目下的整数求和时,新地图将包含累积计数。我陷入了困境。谁能帮我设计一个算法。我是Java Stream api的新手,如果可以使用Stream API做到这一点

示例数据:
example data

在图像中,我尝试遍历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());
                    }
                }
            }
        }

2 个答案:

答案 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());
}
相关问题