组合具有相同键和相同或不同值的两个HashMap

组合具有相同键和相同或不同值的两个HashMap,hashmap,java-7,Hashmap,Java 7,我有两个需要合并的哈希映射 MAP 1 - [[LOCATION: United Kingdom], [PERSON: Alfred Theodore MacConkey], [ORGANIZATION: Royal Commission, United]] MAP 2 -{LOCATION=[United Kingdom], ORGANIZATION=[Royal Commission], PERSON=[Alfred Theodore MacConkey]} 如果我创建Map 3并执行a

我有两个需要合并的哈希映射

MAP 1 - [[LOCATION: United Kingdom], [PERSON: Alfred Theodore MacConkey], [ORGANIZATION: Royal Commission, United]]

MAP 2 -{LOCATION=[United Kingdom], ORGANIZATION=[Royal Commission], PERSON=[Alfred Theodore MacConkey]}
如果我创建Map 3并执行addAll()操作,某些值会被覆盖。就像在组织的情况下,我只得到皇家委员会和联合会得到覆盖。我为两者编写了一个合并代码,但得到了一个空指针异常。我只是想知道这种方法是否正确。我将调试并找出为什么会出现异常

public static  LinkedHashMap<String,Vector<String>> merge(HashMap<String, Vector<String>> a,  HashMap<String, Vector<String>> b) {
                   LinkedHashMap<String,Vector<String>> c = new  LinkedHashMap<String,Vector<String>>();


                   Set<Entry<String,Vector<String>>> entriesA = a.entrySet();
                   Set<Entry<String,Vector<String>>> entriesB = b.entrySet();

                    for (Map.Entry<String, Vector<String>> entry : entriesA ) {

                        Vector<String> aValues = a.get(entry.getValue());
                        String aKey =  entry.getKey();

                        Vector<String> allValues = entriesA.contains(aKey) ? a.get(aKey) : new Vector<String>();  
                        allValues.addAll(aValues);

                        c.put(aKey, allValues);

                    }



                    for (Map.Entry<String, Vector<String>> entry : entriesB ) {
                        Vector<String> bValues = b.get(entry.getValue());
                        String bKey =  entry.getKey();

                        if(c.containsKey(bKey) && c.get(bKey).equals(bValues) ) {
                            continue;
                            } 
                        else if(c.containsKey(bKey) && !(c.get(bKey).equals(bValues))) {
                            c.put(bKey, bValues); 
                      }
                    }
                    return c;
                }
公共静态LinkedHashMap合并(HashMap a、HashMap b){
LinkedHashMap c=新LinkedHashMap();
Set entriesA=a.entrySet();
Set entrieb=b.entrySet();
用于(地图条目:entriesA){
向量aValues=a.get(entry.getValue());
字符串aKey=entry.getKey();
Vector allValues=entriesA.contains(aKey)?a.get(aKey):新向量();
allValues.addAll(aValues);
c、 put(aKey,allValues);
}
for(Map.Entry:entrieb){
向量bValues=b.get(entry.getValue());
字符串bKey=entry.getKey();
if(c.containsKey(bKey)和c.get(bKey).equals(bvalue)){
继续;
} 
else如果(c.containsKey(bKey)和&!(c.get(bKey).equals(bvalue))){
c、 put(bKey,bvalue);
}
}
返回c;
}
此行:

Vector<String> aValues = a.get(entry.getValue());
与:

Set values=新的HashSet(cValues);
values.addAll(bValues);
cValues.clear();
cValues.addAll(值);

这将只处理合并创建的副本,而不是已经存在的副本。

谢谢!但是这个代码似乎不起作用。我消除了空指针异常,但值仍然被覆盖。在第一个循环之前,c是空的,因此,由于键都不同,c不能包含当前键,因此,不需要测试。谢谢!最后一个帮助-我是否可以放弃重复的值?这段代码在我的新c映射中给了我两次每个值。@serendipity非常容易:使用集合而不是向量(顺便说一句,Vector类已被弃用)我尝试过,但这个I.e c映射的输出是另一个方法的输入,该方法接收字符串和向量的映射。所以我有个问题。我试过投,但显然你不能投一个向量集。
Vector<String> aValues = entry.getValue();
    LinkedHashMap<String, Vector<String>> c = new LinkedHashMap<String, Vector<String>>();

    for (Map.Entry<String, Vector<String>> entry : a.entrySet()) {
        Vector<String> aValues = entry.getValue();
        String aKey = entry.getKey();
        c.put(aKey, new Vector<String>(aValues));
    }
    for (Map.Entry<String, Vector<String>> entry : b.entrySet()) {
        Vector<String> bValues = entry.getValue();
        String bKey = entry.getKey();
        Vector<String> cValues = c.get(bKey);
        if (cValues == null) {
            c.put(bKey, new Vector<String>(bValues));
        } else {
            cValues.addAll(bValues);
        }
    }
    return c;
        cValues.addAll(bValues);
Set<String> values = new HashSet<String>(cValues);
values.addAll(bValues);
cValues.clear();
cValues.addAll(values);