我正在尝试构建一种方法来合并两个地图的内容。我在这里环顾了一段时间,看不出有什么方法可以使它通用。如果可能的话,我想避免@SuppressWarnings("unchecked")
注释。我有一个嵌套的映射结构,其中键是字符串,值是更多东西的映射,此结构中的“叶”节点始终是集合。所以在大多数情况下,我有两个结构如下的地图:
Map<String,Map<String,Set<String>>>
我想合并两个映射,以便最终得到两者的联合,并且这两个映射中的任何公共键都在结果映射中表示,其值是两个映射中两个值的合并。在代码中,这是我迄今为止所拥有的:
@SuppressWarnings("unchecked")
public Map<String,Object> merge(final Map<String, Object> map1,
final Map<String, Object> map2) {
final Map<String,Object> merged = new HashMap<String,Object>(map1);
for (final Map.Entry<String,Object> entry : merged.entrySet()) {
final String key = entry.getKey();
final Object value = entry.getValue();
if (map2.containsKey(key)) {
final Object value2 = map2.get(key);
if ((value instanceof Map) && (value2 instanceof Map)) {
merged.put(key, merge((Map<String, Object>) value, (Map<String, Object>) value2));
} else if ((value instanceof Set) && (value2 instanceof Set)) {
final Set<Object> set = new HashSet<Object>((Set<Object>)value);
set.addAll((Set<Object>) value2);
merged.put(key, set);
} else {
// throw up, should only ever be a map or a set
}
}
}
for (final String key : map2.keySet()) {
if (!merged.containsKey(key)) {
merged.put(key, map2.get(key));
}
}
return merged;
}
它完成了这项工作,但我对它不满意,因为使用它你正在铸造一大堆东西,它还对你正在使用的 Set 和 Map 实现做出假设。鉴于我知道我一直在处理字符串到某物的映射,其中某物是一组字符串或另一个字符串到某物的映射,我试图弄清楚如何使用泛型来规范这一点。我在这里摆弄了其他答案中显示的类似但不完全相同的方法,例如方法签名,例如:
public <T extends Map<String,T>> Map<String,T> merge(final T map1, final T map2)
但这并没有奏效,因为递归调用不喜欢我尝试输入Map<String,Set<String>>
.
我承认以前不需要深入研究泛型。非常感谢任何指导。