Нахождение суммы каждого ключа ListMultiMap - PullRequest
2 голосов
/ 20 марта 2020

Я не могу найти простой способ найти сумму всех ключей в ListMultiMap в Java.

У меня есть ListMultiMap: ListMultimap<String, Long> foodCals = ArrayListMultimap.create();

, который содержит разные ключи с несколькими значения в них:

["19/03/2020": 77, 88, 88], ["18/03/2020": 22, 33, 21], ["17/03/2020": 77, 33, 88]

Как вы находите сумму каждого ключа? И получить вывод, как: 1-253, 2-76, 3-198.

Примерно так:

int p = 0;
for(String s : foodCals.keySet()){
    System.out.Println(p + foodCals.sumOfKey(p)) //Print the index number + the sumOfKey (sumOfKey doesn't exist).
    p++;
}

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Нет встроенной функции для этого, но обработка мультикарты как карты (с asMap()) даст вам набор значений в день. Оттуда вам просто нужно суммировать их, например, путем их потоковой передачи и преобразования в примитивы:

int p = 0;
for (Collection<Long> vals : foodCals.asMap().values()) {
    System.out.println(p + " - " + vals.stream().mapToLong(Long::longValue).sum());
    p++;
}

РЕДАКТИРОВАТЬ:

Для более старых Java версий (до 8) должен применяться тот же лог c, хотя синтаксис немного более грубый, и вам придется самостоятельно суммировать значения:

int p = 0;
for (Collection<Long> vals : foodCals.asMap().values()) {
    long sum = 0L;
    for (Long val : vals) {
        sum += val;
    }
    System.out.println(p + " - " + sum);
    p++;
}
0 голосов
/ 20 марта 2020

Возможно, вы просто пытаетесь суммировать значения для key во время итерации по keySet:

ListMultimap<String, Long> foodCals = ArrayListMultimap.create();
Map<String, Long> summingEntries = foodCals.keySet()
        .stream()
        .collect(Collectors.toMap(k -> k,
                k -> foodCals.get(k).stream()
                        .mapToLong(i -> i).sum()));

Это приведет к

{19/03/2020=253, 17/03/2020=198, 18/03/2020=76}

A аналогичные логики c без Stream с и лямбды будут:

Map<String, Long> summingEntries = new HashMap<>();
for (String k : foodCals.keySet()) {
    long sum = 0L;
    for (Long i : foodCals.get(k)) {
        sum += i;
    }
    if (summingEntries.put(k, sum) != null) {
        throw new IllegalStateException("Duplicate key");
    }
}
...