2012-02-18 62 views
1

我一直想知道現在幾天,對我的問題可能是最麻煩的方法。我有一組10個枚舉類型,例如{零個,一個,兩個,三個,四個,五個,六個,七個,八個,九個}和I使用這些枚舉作爲鍵在地圖通過添加/減去相應值來合併地圖

Map<MyEnumType, Integer> myMap; 

然後我生成100個左右的這些地圖,同相同的鍵但不同的值。將所有這些地圖添加到一個地圖的最佳做法是什麼?我的意思是將我生成的100張地圖的所有值加起來。

回答

4

遍歷枚舉值,併爲每個枚舉值,遍歷地圖(反之亦然):

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); 
} 
1

其他選項是創建特定類總結整數,而不是以前的壓倒一切的價值觀。這裏有一個例子它是如何與匿名類來完成:

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