java - 如何比较 2 LinkedHashMap 并获得键和值的差异?
问题描述
有 2 个 LinkedHashMap。我必须检查两个 LinkedHashMaps 是否具有相同的键和值。如果一个 LinkedHashMap 包含额外的键 + 值,那么它应该被打印或存储在第三个 LinkedHashMap 中。如果第二个 LinkedHashMap 中的任何键或值不同,则应通知它(在控制台中打印)
例如
Map1 包含 {Aa, Bb, Cc}
Map2 包含 {Aa, Br, Cc, Zz}
所以这里第三个 LinkedHashMap 应该包含 {Zz} 因为它包含额外的键和
{Br} 应该在修改后打印
解决方案
你可以使用这个类:)
public class MapCompare {
private LinkedHashMap<String, String> differencesMap;
private LinkedHashMap<String, String> extraMap;
private void main(LinkedHashMap<String, String> map1, LinkedHashMap<String, String> map2) {
this.differencesMap = new LinkedHashMap<>();
this.extraMap = new LinkedHashMap<>();
Set<Map.Entry<String, String>> set1 = ((LinkedHashMap<String, String>) map1.clone()).entrySet();
Set<Map.Entry<String, String>> set2 = ((LinkedHashMap<String, String>) map2.clone()).entrySet();
set1.removeAll(set2);
compare(set1, map2);
set1 = map1.entrySet();
set2.removeAll(set1);
compare(set2, map1);
}
private LinkedHashMap<String, String> getDifferencesMap() {
return differencesMap;
}
private LinkedHashMap<String, String> getExtraMap() {
return extraMap;
}
private void compare(Set<Map.Entry<String, String>> set, LinkedHashMap<String, String> map) {
for (Map.Entry<String, String> entry : set) {
String key = entry.getKey();
String value = entry.getValue();
if (map.containsKey(key) || map.containsValue(value)) {
differencesMap.put(key, value);
} else {
extraMap.put(key, value);
}
}
}
public static void main(String[] args) {
LinkedHashMap<String, String> map1 = new LinkedHashMap<>();
map1.put("A", "a");
map1.put("B", "b");
map1.put("C", "c");
LinkedHashMap<String, String> map2 = new LinkedHashMap<>();
map2.put("A", "a");
map2.put("C", "c");
map2.put("B", "r");
map2.put("Z", "z");
MapCompare mapCompare = new MapCompare();
mapCompare.main(map1,map2);
System.out.println("diff: " + mapCompare.getDifferencesMap());
System.out.println("extra: " + mapCompare.getExtraMap());
}
}
推荐阅读
- c - 在堆栈中交替显示顶部和底部
- typescript - 打字稿手动缩小子范围内的联合类型
- single-sign-on - Nginx 反向代理后面的 Tomcat - 收件人端点与 SAML 响应不匹配
- c# - Polly 使用 URL、标头、内容和响应记录所有请求
- r-markdown - 如何在 R Markdown 中按降序将表中的值放入表中?
- python - 如何解决“TypeError: cannot unpack non-iterable int object”
- javascript - 如何在样式规范中添加 mapbox api?
- typo3 - 未声明的参数传递给 ViewHelper maxRange
- cmake - Conan.io 和仅标头库
- python - 使用 Python 更快地获取 Windows 文件的所有者