如何在java中接收地图的差异?
我有两张地图:如何在java中接收地图的差异?,java,collections,map,set,set-difference,Java,Collections,Map,Set,Set Difference,我有两张地图: Map<String, Object> map1; Map<String, Object> map2; map1; map2地图; 我需要收到这些地图之间的差异。是否存在可能是apache utils如何接收此差异? 现在似乎需要获取每个映射的条目集,并找到diff1=set1-set2和diff2=set2-set1。 创建摘要映射后=diff1+diff2 看起来很尴尬。存在另一种方式吗? 谢谢。Set diff=new HashSet((map1
Map<String, Object> map1;
Map<String, Object> map2;
map1;
map2地图;
我需要收到这些地图之间的差异。是否存在可能是apache utils如何接收此差异?
现在似乎需要获取每个映射的条目集,并找到diff1=set1-set2和diff2=set2-set1。
创建摘要映射后=diff1+diff2
看起来很尴尬。存在另一种方式吗?
谢谢。Set diff=new HashSet((map1.entrySet());
diff.addAll(map2.entrySet())//联合
Set tmp=newhashset((map1.entrySet());
tmp.retainal(map2.entrySet())//交叉
差分清除法(tmp)//差异
怎么样
试着用番石榴汁。如果我理解的很好,你正在尝试计算两个地图条目集之间的甜菜
Map<String, Object> map1;
Map<String, Object> map2;
Set<Entry<String, Object>> diff12 = new HashSet<Entry<String, Object>>(map1.entrySet());
Set<Entry<String, Object>> diff21 = new HashSet<Entry<String, Object>>(map2.entrySet());
Set<Entry<String, Object>> result;
diff12.removeAll(map2.entrySet());
diff21.removeAll(map1.entrySet());
diff12.addAll(diff21);
给出:
[e=5, c=3, b=2]
这是正确的结果。但是,如果我们这样做:
public class CustomInteger {
public int val;
public CustomInteger(int val) {
this.val = val;
}
@Override
public String toString() {
return String.valueOf(val);
}
}
map1.put("a", new CustomInteger(1));
map1.put("b", new CustomInteger(2));
map1.put("c", new CustomInteger(3));
map1.put("d", new CustomInteger(4));
map2.put("a", new CustomInteger(1));
map2.put("d", new CustomInteger(4));
map2.put("e", new CustomInteger(5));
相同的算法给出以下输出:
[e=5, a=1, d=4, d=4, b=2, a=1, c=3]
这是不正确的(可能会被描述为笨拙:))
在第一个示例中,映射用int值填充,int值自动转换为整数值
有自己的实现方式和方法
CustomInteger类没有实现这些方法,因此它从无所不在的环境中删除它们
来自的API文档说明如下:
从此集合中删除指定集合中包含的所有元素
(可选操作)。如果指定的集合也是一个集合,则此操作会有效地修改此集合,使其值为两个集合的非对称集合差
为了确定两个集合中都包含哪些元素,removeAll方法使用集合元素的equals方法
这就是问题所在:如果两个数值相同,Integer的equals方法将返回true,而Object的equals方法仅当它是相同的对象时才会返回true,例如。
:
如果仍然有点模糊,我强烈建议阅读以下教程:
- 以下是一个简单的片段,您可以使用它来代替大量的番石榴库:
public static <K, V> Map<K, V> mapDifference(Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
Map<K, V> difference = new HashMap<>();
difference.putAll(left);
difference.putAll(right);
difference.entrySet().removeAll(right.entrySet());
return difference;
}
公共静态地图地图差异(地图构建以处理不同大小的地图
public static <K, V> Map<K, V> mapDiff(Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
Map<K, V> difference = new HashMap<>();
difference.putAll(left);
difference.putAll(right);
difference.entrySet().removeAll(left.size() <= right.size() ? left.entrySet() : right.entrySet());
return difference;
}
publicstaticmap-mapDiff(Map简单的方法。如果您需要复杂的方法,您可以更改过滤器来比较值
Map-map1=newhashmap(){{
将(“A”、“1”);
认沽权(“B”、“2”);
付诸表决(“C”、“3”);
}};
Map map2=新的HashMap(){{
将(“A”、“1”);
认沽权(“B”、“2”);
付诸表决(“D”、“3”);
}};
Map newList=map1.keySet().stream().filter(str->!map2.containsKey(str)).collect(Collectors.toMap(v->v,v->map1.get(v));
Map oldList=map2.keySet().stream().filter(str->!map1.containsKey(str)).collect(Collectors.toMap(v->v,v->map2.get(v));
System.out.println(newList);
System.out.println(旧列表);
答案看起来不正确。Map1可以包含map2,或者map2可以包含Map1,或者在任何方向上都可以存在相等或差异。谢谢。我考虑过番石榴,但为了这个需要在项目中引入新库,最好不要这样做。@user710818您不会后悔的-这是一个很好的选择library@user710818你应该在你的项目中使用它如果使用简单数学,则可以在java中实现一个简单的函数库。不需要为此引入其他库。如果两个映射的条目值不同,但键相同,则此库非常方便
返回一个不可修改的映射,描述出现在两个映射中但值不同的键。上面的答案更巧妙地解决了差异计算!需要注意的是,这将丢失所有只有值更改的条目,因此这是键上的差异
public class CustomInteger {
public int val;
public CustomInteger(int val) {
this.val = val;
}
@Override
public String toString() {
return String.valueOf(val);
}
}
map1.put("a", new CustomInteger(1));
map1.put("b", new CustomInteger(2));
map1.put("c", new CustomInteger(3));
map1.put("d", new CustomInteger(4));
map2.put("a", new CustomInteger(1));
map2.put("d", new CustomInteger(4));
map2.put("e", new CustomInteger(5));
[e=5, a=1, d=4, d=4, b=2, a=1, c=3]
Integer a = 1; //autoboxing
Integer b = new Integer(1);
Integer c = 2;
a.equals(b); // true
a.equals(c); // false
CustomInteger d = new CustomInteger(1);
CustomInteger e = new CustomInteger(1);
CustomInteger f = new CustomInteger(2);
d.equals(e); //false
d.equals(f) // false
d.val == e.val //true
d.val == f.val //false
public static <K, V> Map<K, V> mapDifference(Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
Map<K, V> difference = new HashMap<>();
difference.putAll(left);
difference.putAll(right);
difference.entrySet().removeAll(right.entrySet());
return difference;
}
public static <K, V> Map<K, V> mapDiff(Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
Map<K, V> difference = new HashMap<>();
difference.putAll(left);
difference.putAll(right);
difference.entrySet().removeAll(left.size() <= right.size() ? left.entrySet() : right.entrySet());
return difference;
}