我想计算两个哈希映射的键的并集。我写了下面的代码(MWE如下),但我
获取UnsupportedOperationException。实现这一目标会有什么好处?
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class AddAll {
public static void main(String args[]){
Map<String, Integer> first = new HashMap<String, Integer>();
Map<String, Integer> second = new HashMap<String, Integer>();
first.put("First", 1);
second.put("Second", 2);
Set<String> one = first.keySet();
Set<String> two = second.keySet();
Set<String> union = one;
union.addAll(two);
System.out.println(union);
}
}
答案 0 :(得分:7)
因此,union
不是one
的副本,是 one
。 是 first.keySet()
。 first.keySet()
不是first
,it's a view, and won't support adds的键的副本,如Map.keySet()
中所述。
所以你需要实际复制一份。最简单的方法可能是编写
one = new HashSet<String>(first);
使用HashSet
的“复制构造函数”来执行实际复制,而不是仅仅引用同一个对象。
答案 1 :(得分:1)
请记住keySet
是地图的实际数据,它不是副本。如果它允许你在那里调用addAll
,那么你将把所有这些键转储到没有值的第一个地图中! HashMap特意允许您使用实际地图的put
类型方法添加新映射。
您希望union
可能是一个实际的新集,而不是第一个hashmapL的后备数据
Set<String> one = first.keySet();
Set<String> two = second.keySet();
Set<String> union = new HashSet<String>(one);
union.addAll(two);
答案 2 :(得分:0)
使用以下代码
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class AddAll {
public static void main(String args[]){
Map<String, Integer> first = new HashMap<String, Integer>();
Map<String, Integer> second = new HashMap<String, Integer>();
Map<String, Integer> union = new HashMap<String, Integer>();
first.put("First", 1);
second.put("Second", 2);
union.putAll(first);
union.putAll(second);
System.out.println(union);
System.out.println(union.keySet());
}
}