【问题标题】:How to SUM duplicate key values in LinkedHashMap?如何对 LinkedHashMap 中的重复键值求和?
【发布时间】:2018-06-06 23:10:58
【问题描述】:

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

这是我的地图

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

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

costByDuration.put(call_from, toPay);

【问题讨论】:

    标签: java linked-list hashmap


    【解决方案1】:

    我会创建一个方法如下:

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

    那么用例将是:

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

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

    【讨论】:

    • 不错。有趣的是Double 有一个+ 的功能版本(我直到现在才知道),但不是-*/%
    • @DawoodibnKareem 我的猜测是添加是最常用的,但又一次可以说它缺乏一致性。我猜只有作者才能回答……
    • 我可能不会调用方法put,因为合并而不是替换的put 会让未来的读者感到惊讶。也许addToTotal 或任何其他适合您的域的名称
    • @Hulk 太好了,谢谢!当我发布答案时,我没有考虑太多命名。我想我们将在决定适合您提到的域模型的最佳名称时将其留给 OP。 :)
    【解决方案2】:

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

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

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

    【讨论】:

    • 可以用Map::merge简化,但我喜欢+1 :)
    【解决方案3】:

    使用merge函数:

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

    【讨论】:

    • oldPay 适合你吗?
    • oldPay 是现有值,地图会自动计算它。查看编辑后的答案
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多