【问题标题】:Merging maps by adding/subtracting corresponding values通过添加/减去相应的值来合并地图
【发布时间】:2012-03-09 13:23:07
【问题描述】:

这几天我一直在想,解决我的问题的最简单的方法是什么。我有一组 10 种枚举类型,例如{ 零、一、二、三、四、五、六、七、八、九 } 我使用这些枚举作为映射中的键

Map<MyEnumType, Integer> myMap;

然后我生成了 100 个左右的这些映射,具有相同的键但不同的值。将所有这些地图合二为一的最佳做法是什么?我的意思是把我生成的那 100 张地图的所有价值加起来。

【问题讨论】:

    标签: java map addition subtraction


    【解决方案1】:

    遍历枚举值,并为每个枚举值遍历映射(反之亦然):

    Map<MyEnumType, Integer> sumMap = new EnumMap<MyEnumType, Integer>(MyEnumType.class);
    for (MyEnumType e : MyEnumType.values()) {
        int sum = 0;
        for (Map<MyEnumType, Integer> map : maps) {
            sum += map.get(e); // you might want a null check here
        }
        sumMap.put(e, sum);
    }
    

    【讨论】:

      【解决方案2】:

      其他选项是创建特定于对整数求和的类,而不是覆盖以前的值。这是一个如何使用匿名类完成的示例:

      public class MapSummer {
      
          private final Map<MyEnumType, Integer> sumMap = new HashMap<MyEnumType, Integer>() {
              @Override
              public Integer put(MyEnumType key, Integer value) {
                  return super.put(key, get(key) + value);
              }
      
              @Override
              public Integer get(Object key) {
                  return super.get(key) != null ? super.get(key) : 0;
              }
          };
      
          public Map<MyEnumType, Integer> sum(List<Map<MyEnumType, Integer>> mapList) {
              for (Map<MyEnumType, Integer> map : mapList) {
                  sumMap.putAll(map);
              }
              return sumMap;
          }
      
      }
      
      enum MyEnumType {
          ONE, TWO, THREE, FOUR;
      }
      

      和单元测试:

      public class MapSummerTest {
      
          private final MapSummer summer = new MapSummer();
      
          @Test
          public void shouldSumValuesInMap() {
              final Map<MyEnumType, Integer> map1 = new HashMap<MyEnumType, Integer>() {{
                  put(ONE, 1);
                  put(TWO, 2);
              }};
      
              final Map<MyEnumType, Integer> map2 = new HashMap<MyEnumType, Integer>() {{
                  put(TWO, 2);
                  put(THREE, 3);
              }};
      
              final Map<MyEnumType, Integer> sumMap = summer.sum(Arrays.asList(map1, map2));
      
              assertThat(sumMap.get(ONE), equalTo(1));
              assertThat(sumMap.get(TWO), equalTo(4));
              assertThat(sumMap.get(THREE), equalTo(3));
              assertThat(sumMap.get(FOUR), equalTo(0));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多