将两个哈希映射与相同的键和相同或不同的值组合在一起

时间:2017-02-21 12:10:00

标签: 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并执行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;
                }

1 个答案:

答案 0 :(得分:1)

这一行:

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

应该是:

Vector<String> aValues = entry.getValue();

更新:

哦!同样适用于bValues

更新2:

又一个问题:entriesA.contains(aKey)应该是a.contains(aKey)

更新3:

尝试这样的事情:

    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;

更新4:

要避免重复值,请替换line:

        cValues.addAll(bValues);

使用:

Set<String> values = new HashSet<String>(cValues);
values.addAll(bValues);
cValues.clear();
cValues.addAll(values);

这只会处理合并创建的重复项,而不是已经存在的重复项。