2012-02-18 5 views
1

며칠 동안 궁금해했는데, 내 문제에 대해 가장 지저분한 접근 방법이 될 수 있습니다. 예 : 열거 형 10 개 세트가 있습니다. {0, 1, 둘, 셋, 넷, 다섯, 여섯, 일곱, 여덟, 아홉}와 나는 함께해당 값을 더하거나 뺍니다. 맵을 병합합니다.

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)); 
    } 
} 
여기가 익명 클래스로 이루어집니다 어떻게 예입니다