比较Java中的两个Map



我希望能够比较两个数组(它们将包含相同XML但不同年龄的值,这样我就可以查看是否进行了任何更改)。我有两个数组,一个包含我已解析的旧XML行的属性和值,另一个包含中已解析的同一XML行的最新版本和属性。

示例:

Array1:                                                                         
rect x="220.00"                    
width="300.00" 
id="rect_1" 
y="180.00" 
height="280.00" 
Array2:                                                                         
rect x="300.00"                    
width="400.00" 
id="rect_1" 
height="280.00"
info = "description"
etc etc

因此,在这里,变化将是:

  • rect x属性已从220(array1)更改为300(array2)
  • width属性已从300(array1)更改为400(array2)
  • Array2获得了一个名为info的属性
  • y已从阵列2中删除2

我该如何比较两个数组并显示这样的结果?基本上,我希望它能显示变化和差异。

这是我试过的代码:

Collection<String> listOne = Arrays.asList(array1);
Collection<String> listTwo = Arrays.asList(array);
Collection<String> similar = new HashSet<String>( listOne );
Collection<String> different = new HashSet<String>();
different.addAll( listOne );
different.addAll( listTwo );
similar.retainAll( listTwo );
different.removeAll( similar );
resultsBuff.append("nDifferences: n"+ different + "nnChanges: n" + similar);

这段代码并没有完全达到我想要的效果(如前所述)。

您别无选择,只能在两个数组中循环。我会循环遍历属性,拆分键和值,并为每个数组构建一个HashMap。

Map<String, String> map1 = new HashMap<String, String>() 
for (String attribute : array1) {    
  String[] splitted = attribute.split("=");   
  map1.put(splitted[0], splitted[1]); 
}

执行相同操作以创建map2。

Map<String, String> map2 = new HashMap<String, String>(); 
...

循环浏览第一个映射,并验证键/值是否与检测到的属性删除不同或是否存在于映射2中。

for (String key : map1.keySet()) {    
  if (!map2.containsKey(key)) {
    System.out.println(key + "has been removed from Array2" )
  } else if (!map1.get(key).equals(map2.get(key)) {
    System.out.println(key + "attribute has changed from " + map1.get(key) + " to " + map2.get(key)  );
  } 
}

循环通过map2检测新属性

for (String key : map2.keySet()) {    
  if (!map1.containsKey(key)) {
    System.out.println(key + "has been added to Array2" );
}

希望这能有所帮助!

我会使用HashMap而不是数组,因为它更适合这种键/值结构:

map.put("rect x","220.00");
map.put("width","300.00");
...

从这两个数组中构建2个哈希图,并对它们进行比较:

if(!map1.equals(map2)) { //something has changed
    //loop over keys and compare values
}

我会创建一个包含这些信息的对象,并实现一个自定义的equals。您不需要使用数组作为数据结构。您可以使用对象。

例如

public class MyObject{
    private double rect_x;
    private double width;
    private double id;
    private double y;
    private double height
    //usual getters and setters
    //implement hashcode
    //implemement equals eg
    public boolean equals (Object o) {
        if (!(o instanceof MyObject)){
             return false;
        }
        MyObject that=  MyObject.class.cast(o);
        return this.width == that.width && this.id == that.id etc etc
    }
}

你已经有地图了吗?或者它们只是阵列
我的意思是,这些"标签"是隐含的还是不隐含的
如果它们不是,而你实际上有两张地图,你可以很容易地做一些事情,比如:

for(Map.Entry<String,String> pair : array1){
    String key = pair.getKey();
    String value = pair.getValue();
    if(!array2.containsKey(key)){
        System.out.println("Array2 lost attribute " + key);
    }else{
        String value2 = array2.get(key);
        if(!value.equals(value2){
            System.out.println("The '"+key+"' attribute  has changed from "+value+" to "+ value2 ;
        }
        array2.remove(key);
    }
}
for(Map.Entry<String,String> pair : array2){
    String key = pair.getKey();
    System.out.println("Array2 gained attribute " + key);
}

如果您没有明确的标签,您只需在此代码之前创建另一个映射,并使用它来构建两个映射。。。。

相关内容

  • 没有找到相关文章

最新更新