组合两个具有相同键和相同或不同值的哈希图
Combining two hashmaps with the same key and same or different values
我有两个哈希图需要合并。
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]}
如果我创建地图 3 并执行 addAll(),一些值会被覆盖。就像在 ORGANIZATION 的情况下,我只会获得皇家委员会,而 United 会被覆盖。我为两者写了一个合并代码但是得到一个空指针异常。我只想知道这种方法是否正确。我会调试并弄清楚为什么会出现异常。
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;
}
这一行:
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:
为避免重复值,请替换行:
cValues.addAll(bValues);
有:
Set<String> values = new HashSet<String>(cValues);
values.addAll(bValues);
cValues.clear();
cValues.addAll(values);
这只会处理合并创建的重复项,而不是那些已经存在的副本。
我有两个哈希图需要合并。
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]}
如果我创建地图 3 并执行 addAll(),一些值会被覆盖。就像在 ORGANIZATION 的情况下,我只会获得皇家委员会,而 United 会被覆盖。我为两者写了一个合并代码但是得到一个空指针异常。我只想知道这种方法是否正确。我会调试并弄清楚为什么会出现异常。
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;
}
这一行:
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:
为避免重复值,请替换行:
cValues.addAll(bValues);
有:
Set<String> values = new HashSet<String>(cValues);
values.addAll(bValues);
cValues.clear();
cValues.addAll(values);
这只会处理合并创建的重复项,而不是那些已经存在的副本。