有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中一种将日数据映射为周数据的算法

我有一张LocalDate和整数的地图,上面有每天的数据。现在,我想用每周数据创建一个新的映射,这意味着当我们将前一个条目和当前条目下的整数相加时,新映射将包含累积计数。我被困在这里面了。有人能帮我设计一个算法吗。我不熟悉Java流api,如果使用流api是可行的,它将

示例数据:
example data

在这张图片中,我试着遍历了周地图,然后在里面遍历了每日地图。但我不知道如何在代码(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) 个答案

  1. # 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));
    
  2. # 2 楼答案

    我认为您应该包括验证currentEntry.key == todayEntry.key的edge案例,然后对前面的值求和

    代码可能看起来有点像这样:

    if(todayEntry.getKey().equals(currEntry.getKey())) {
         currEntry.setValue(currEntry.getValue() + todayEntry.getValue() + prevEntry.getValue());
    }