1

2つの配列を比較できるようにしたいと思います(同じXMLの値を保持しますが、年齢が異なるため、変更が加えられているかどうかを確認できます)。2つの配列があります。1つには解析した古いXML行の属性と値が含まれ、もう1つには解析した同じ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
  • yarray2から削除されました

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 + "\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

この情報を保持するオブジェクトを作成し、カスタム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
    }

}
于 2012-08-31T08:48:06.563 に答える
0

すでにマップをお持ちですか?それとも単なる配列ですか?
つまり、それらの「ラベル」は暗黙的ですか?
そうではなく、実際に 2 つのマップがある場合は、次のように簡単に実行できます。

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

明示的なラベルがない場合は、このコードの前に別のマッピングを作成し、それを使用して 2 つのマップを作成します....

于 2012-08-31T09:08:41.563 に答える