如何在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;
          }