计算Java中两个HashMaps的keySet的并集

时间:2013-02-15 00:26:30

标签: java hashmap set

我想计算两个哈希映射的键的并集。我写了下面的代码(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);


    }


}

3 个答案:

答案 0 :(得分:7)

因此,union不是one副本 one first.keySet()first.keySet()不是firstit'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());


    }


}