Преобразование карты из ежедневных данных в недельные данные в Java - PullRequest
0 голосов
/ 04 октября 2018

У меня есть карта LocalDate и целое число с ежедневными данными.Теперь я хочу создать новую карту с еженедельными данными, что означает, что новая карта будет содержать совокупное количество, когда мы суммируем целые числа, которые подпадают под предыдущую запись и текущую запись.Я застрял в этом.Может кто-нибудь, пожалуйста, помогите мне в разработке алгоритма для этого.Я новичок в Java Stream API, если это выполнимо с помощью Stream API, он будет

Пример данных:
example data

В изображении, которое я пробовал пересечь WeeklyMap, а затем внутрикоторый прошел дневную карту.Но я не уверен, как сделать это возможным в коде (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 голосов
/ 04 октября 2018

Я думаю, вы должны включить регистр ребра, который проверяет currentEntry.key == todayEntry.key, а затем суммировать предыдущие значения.

Код может выглядеть примерно так:

if(todayEntry.getKey().equals(currEntry.getKey())) {
     currEntry.setValue(currEntry.getValue() + todayEntry.getValue() + prevEntry.getValue());
}
0 голосов
/ 04 октября 2018

Кажется, проще всего сначала построить дневную карту кумулятивных сумм, а затем отфильтровать только понедельники:

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));
}

edit:

Если вы хотитеСохраняя порядок полученной карты, вы можете изменить последний collect() вызов:

.collect(Collectors.toMap(
             Map.Entry::getKey, Map.Entry::getValue,
             (v1, v2) -> { throw new RuntimeException("Duplicate key - can't happen"); },
             TreeMap::new));
...