Как суммировать повторяющиеся значения ключей в LinkedHashMap? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть LinkedHashMap, где у меня есть два дубликата ключей с соответствующими значениями, мне нужно знать, как суммировать эти значения в один ключ.В настоящее время он удаляет старое дублированное значение и помещает новое

Это моя карта

static Map<String, Double> costByDuration = new LinkedHashMap<>();

Здесь я помещаю значения (call_from может быть 912345678 и иметь значение 10,а затем еще один вызов из 912345678 со значением 20), затем я хочу, чтобы 912345678 имел значение 30 вместо сохранения только одного.

costByDuration.put(call_from, toPay);

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Попробуйте использовать метод containsKey:

static Map<String, Double> costByDuration = new LinkedHashMap<>();
if(costByDuration.containsKey(call_from) { 
    costByDuration.put(call_from, map.get(call_from) + to_Pay);
} else {
    costByDuration.put(call_from, to_Pay);
}
0 голосов
/ 07 июня 2018

Сначала вам нужно проверить, есть ли ваше значение на карте.

Double existingValue = costByDuration.get(callFrom);
if (existingValue != null) {
    costByDuration.put(callFrom, existingValue + toPay);
}  else {
    costByDuration.put(callFrom, toPay);
}

Кстати, это плохая идея использовать Double для хранения суммы денег, если вы хотитеваши арифметические операции, чтобы дать вам правильный ответ.Я настоятельно рекомендую использовать BigDecimal вместо Double.

0 голосов
/ 07 июня 2018

Я бы создал метод следующим образом:

public void put(String key, Double value){
    costByDuration.merge(key,value , Double::sum);
}

, тогда вариант использования будет:

put(call_from, toPay);
put(anotherKey, anotherValue);
...
...

Это решение внутренне использует merge метод, который в основном говорит, что указанный ключ еще не связан со значением или связан с нулем, связывает его с заданным ненулевым значением.В противном случае заменяет связанное значение результатами данной функции переназначения.

0 голосов
/ 07 июня 2018

Использование Слияние Функция:

costByDuration.merge(call_from, toPay, (oldPay, toPay) -> oldPay + toPay);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...