如何在LinkedHashMap中SUM重复键值?

时间:2018-06-06 23:10:59

标签: java linked-list hashmap

我有一个LinkedHashMap,其中有两个重复的键及其对应的值,我需要知道如何将这些值合并为一个键。目前,他消除了旧的重复值,并将新的值

这是我的地图

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

这是我放置值的地方(call_from可以是912345678并且值为10,然后是另一个来自912345678的值并且值为20),然后我希望912345678的值为30而不是仅保留之一。

costByDuration.put(call_from, toPay);

4 个答案:

答案 0 :(得分:7)

我按如下方式创建方法:

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

然后用例将是:

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

此解决方案在内部使用merge方法,该方法基本上表示如果指定的键尚未与值关联或与null关联,则将其与给定的非空值相关联。否则,将相关值替换为给定重映射函数的结果。

答案 1 :(得分:3)

使用merge功能:

costByDuration.merge(call_from, toPay, (oldPay, toPay) -> oldPay + toPay);

答案 2 :(得分:3)

您必须先检查您的值是否已在地图中。

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

顺便说一句,如果您希望算术运算能够给出正确的答案,那么使用Double存储一定数量的金钱是一个坏主意。我强烈建议您使用BigDecimal代替Double

答案 3 :(得分:0)

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