我希望能够比较两个数组(它们将包含相同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);
}
如果您没有明确的标签,您只需在此代码之前创建另一个映射,并使用它来构建两个映射。。。。