我一直想知道现在几天,对我的问题可能是最麻烦的方法。我有一组10个枚举类型,例如{零个,一个,两个,三个,四个,五个,六个,七个,八个,九个}和I使用这些枚举作为键在地图通过添加/减去相应值来合并地图
Map<MyEnumType, Integer> myMap;
然后我生成100个左右的这些地图,同相同的键但不同的值。将所有这些地图添加到一个地图的最佳做法是什么?我的意思是将我生成的100张地图的所有值加起来。
我一直想知道现在几天,对我的问题可能是最麻烦的方法。我有一组10个枚举类型,例如{零个,一个,两个,三个,四个,五个,六个,七个,八个,九个}和I使用这些枚举作为键在地图通过添加/减去相应值来合并地图
Map<MyEnumType, Integer> myMap;
然后我生成100个左右的这些地图,同相同的键但不同的值。将所有这些地图添加到一个地图的最佳做法是什么?我的意思是将我生成的100张地图的所有值加起来。
遍历枚举值,并为每个枚举值,遍历地图(反之亦然):
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);
}
其他选项是创建特定类总结整数,而不是以前的压倒一切的价值观。这里有一个例子它是如何与匿名类来完成:
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));
}
}