1

我希望能够比较两个数组(它们将保存相同 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已从 array2 中删除

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

这是我试过的代码:

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 + "\n\nChanges: \n" + similar);

这段代码并没有完全按照我的意愿去做(如前所述)。

4

4 回答 4

2

您别无选择,只能遍历两个数组。我将遍历属性、拆分键和值并为每个数组构建一个 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>(); 
...

循环遍历第一个映射并验证键/值是否不同或存在于 map2 中以检测到属性删除。

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" );
}

希望这可以帮助!

于 2012-08-31T09:31:56.153 回答
1

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

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

从 2 个数组构建 2 个哈希图,并比较它们:

if(!map1.equals(map2)) { //something has changed
    //loop over keys and compare values
}
于 2012-08-31T08:41:24.190 回答
0

我将创建一个包含此信息的对象并实现自定义等于。您不需要将数组用作数据结构。你可以使用一个对象。

例如

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
    }

}
于 2012-08-31T08:48:06.563 回答
0

你已经有地图了?或者它们只是数组?
我的意思是,这些“标签”是否隐含?
如果他们不是并且您实际上有两个地图,您可以轻松地执行以下操作:

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);
}

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

于 2012-08-31T09:08:41.563 回答