Слияние карт путем добавления / вычитания соответствующих значений - PullRequest
1 голос
/ 18 февраля 2012

Несколько дней я размышлял, что может быть наименее грязным подходом к моей проблеме. У меня есть набор из 10 типов enum, например {Ноль, один, два, три, четыре, пять, шесть, семь, восемь, девять), и я использую эти перечисления в качестве ключей на карте

Map<MyEnumType, Integer> myMap;

Затем я генерирую около 100 таких карт с одинаковыми ключами, но разными значениями. Как лучше всего добавлять все эти карты в одну? Я имею в виду сложение всех значений этих 100 карт, которые я сгенерировал.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2012

Итерация по значениям перечисления, и для каждого значения перечисления, итерация по картам (или наоборот):

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 голос
/ 18 февраля 2012

Другой вариант - создать класс, специфичный для суммирования целых чисел, вместо переопределения предыдущих значений.Вот примеры, как это делается с анонимным классом:

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