【问题标题】:How can I not overwrite values via putAll() but instead add to the current value?如何不通过 putAll() 覆盖值,而是添加到当前值?
【发布时间】:2021-03-28 18:45:45
【问题描述】:

假设我有两个哈希映射:

HashMap <String, Integer> h1;
h1.put("hi", 30);
h1.put("hi2",20);
h1.put("hi3",10);
h1.put("hi4",20);


HashMap <String, Integer> h2;
h2.put("hi", 20);
h2.put("hi2", 20);
h2.put("hi3", 20);
h2.put("hi4", 20);

我的问题是,如果我执行以下操作

h2.putAll(h1);

如何将 h2 的值更新为总和,而不是仅仅覆盖它?这就是我想要的

[{"hi"=50}]
[{"hi2"=40}]
[{"hi3"=30}]
[{"hi4"=40}]

不是这个

[{"hi"=30}]
[{"hi2"=20}]
[{"hi3"=10}]
[{"hi4"=20}]

注意:不允许使用函数式构造(包括 lambda)和外部库

【问题讨论】:

    标签: java hashmap treemap


    【解决方案1】:

    您可以为此使用merge 方法:

        h1.forEach((key, value) -> h2.merge( key, value, Integer::sum));
        System.out.println(h2);
    

    老式的方式:

        for(String key : h1.keySet()){
            Integer v1 = h1.get(key);
            Integer v2 = h2.get(key);
            h2.put(key, (v2 == null) ? v1 : v1 + v2);
        }
        System.out.println(h2);
    

    【讨论】:

      【解决方案2】:

      在传统 Java 中(在函数式构造之前),您只需遍历映射并从另一个映射中获取值

      Map<String, Integer> h1 = new HashMap<>();
      h1.put("hi", 30);
      
      Map<String, Integer> h2 = new HashMap<>();
      h2.put("hi", 20);
      
      for (Map.Entry<String, Integer> entry : h2.entrySet()) {
          String key = entry.getKey();
          Integer toAdd = h1.get(key);
          if (toAdd != null) {
              entry.setValue(entry.getValue() + toAdd);
          }
      }
      
      System.out.println("h1 = " + h1);
      System.out.println("h2 = " + h2);
      

      打印出来的

      h1 = {hi=30}
      h2 = {hi=50}
      

      更进一步,如果预期结果应该是 h2 也应该包含来自 h1 的每个不匹配的键,那么您可以使用以下

      Map<String, Integer> h1 = new HashMap<>();
      h1.put("hi", 30);
      h1.put("hii", 40);
      
      Map<String, Integer> h2 = new HashMap<>();
      h2.put("hi", 20);
      
      for (Map.Entry<String, Integer> entry : h1.entrySet()) {
          String key = entry.getKey();
          Integer value = entry.getValue();
          Integer toPossiblyMerge = h2.get(key);
          if (toPossiblyMerge == null) {
              h2.put(key, value);
          } else {
              h2.put(key, value + toPossiblyMerge);
          }
      }
      
      System.out.println("h1 = " + h1);
      System.out.println("h2 = " + h2);
      

      打印出来的

      h1 = {hi=30, hii=40}
      h2 = {hi=50, hii=40}
      

      【讨论】:

        【解决方案3】:

        可以如下图合并两张图:

        import java.util.HashMap;
        import java.util.Map;
        
        public class Main {
            public static void main(String[] args) {
                Map<String, Integer> h1 = new HashMap<>();
                h1.put("hi", 30);
        
                Map<String, Integer> h2 = new HashMap<>();
                h2.put("hi", 20);
                
                Map<String, Integer> h3 = new HashMap<>(h1);
                h2.forEach(
                    (key, value) -> h3.merge(key, value, (v1, v2) -> v1 + v2)
                );
                
                System.out.println(h3);
            }
        }
        

        输出:

        {hi=50}
        

        非 Lambda 解决方案:

        import java.util.HashMap;
        import java.util.Map;
        import java.util.Map.Entry;
        
        public class Main {
            public static void main(String[] args) {
                Map<String, Integer> h1 = new HashMap<>();
                h1.put("hi", 30);
        
                Map<String, Integer> h2 = new HashMap<>();
                h2.put("hi", 20);
        
                Map<String, Integer> h3 = new HashMap<>(h1);
        
                for (Entry<String, Integer> entry : h2.entrySet()) {
                    String key = entry.getKey();
                    h3.put(key, entry.getValue() + h1.getOrDefault(key, 0));
                }
        
                System.out.println(h3);
            }
        }
        

        输出:

        {hi=50}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-23
          • 1970-01-01
          • 2021-10-27
          • 2015-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-26
          相关资源
          最近更新 更多