java - 在 Java 中将 map 从每日数据转换为每周数据

标签 java algorithm java-stream treemap

我有一张包含每日数据的 LocalDate 和 Integer 的 map 。现在我想用每周数据创建一个新 map ,这意味着新 map 将包含当我们总结前一个条目和当前条目下的整数时的累积计数。我被困在这个。谁能帮我设计一个算法。我是 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());
                    }
                }
            }
        }

最佳答案

似乎最简单的方法是首先构建一个累积总和的日图,然后仅过滤掉星期一:

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/

相关文章:

javascript - JavaScript 是否与严格的页面对象模式兼容?

java - Apache Ignite 持久性问题/警告

java - java中的递归搜索

arrays - 有效拾取包围元素

java - 链接消费者 Java 8

java - 如何在 JavaFX FXML 中公平分配 VBox 中的节点

java - 在 HttpServlet 中强制从 HTTPS 请求到 HTTP

java - 如何将 18 个字符的字符串转换为唯一 ID?

kotlin - "parallelStream()"和 "asSequence().asStream().parallel()"之间的区别

java-8 - Java 8 Stream - 使用过滤器将元素添加到列表