Map の比較

Mapの比較、Google Collection Library には、こんな便利なものもある。

Map<String,Integer> map1 = new HashMap<String,Integer>();
map1.put("a",1);
map1.put("b",2);
map1.put("c",3);

Map<String,Integer> map2 = new HashMap<String,Integer>();
map2.put("A",10);
map2.put("b",2);
map2.put("c",30);
map2.put("d",40);

Map<String,Integer> m;

/* key , value 完全一致の取得
 *   Maps.difference→MapDifference<K,V>→entriesInCommon()
 */

m = Maps.difference(map1,map2).entriesInCommon();
System.out.println("##  MapDiffRefernce entriesInCommon()    --> Map");
for(String key : m.keySet()){
   System.out.println(key+" --> "+m.get(key));
}

/* 左側 only 抽出(key が判定対象)
 *   Maps.difference→MapDifference<K,V>→entriesOnlyOnLeft()
 */

m = Maps.difference(map1,map2).entriesOnlyOnLeft();
System.out.println("##  MapDiffRefernce entriesOnlyOnLeft()  --> Map");
for(String key : m.keySet()){
   System.out.println(key+" --> "+m.get(key));
}

/* 右側 only 抽出 (key が判定対象)
 *   Maps.difference→MapDifference<K,V>→entriesOnlyOnRight()
 */

m = Maps.difference(map1,map2).entriesOnlyOnRight();
System.out.println("##  MapDiffRefernce entriesOnlyOnRight() --> Map");
for(String key : m.keySet()){
   System.out.println(key+" --> "+m.get(key));
}

/* 同一key で、value が異なるもの抽出
 *   Maps.difference→MapDifference<K,V>→entriesDiffering()
 */

Map<String,ValueDifference<Integer>> mdif = Maps.difference(map1,map2).entriesDiffering();
System.out.println("##  MapDiffRefernce entriesOnlyOnRight() --> Map<K,ValueDifference<V>>");
for(String key : mdif.keySet()){
   System.out.print(key+" --> "+mdif.get(key));
   ValueDifference<Integer> vdiff = mdif.get(key);
   System.out.println(" :: leftValue = "+vdiff.leftValue()
                      +"  rightValue = "+vdiff.rightValue());
}

実行すると、、、

# MapDiffRefernce entriesInCommon() --> Map
b --> 2
## MapDiffRefernce entriesOnlyOnLeft() --> Map
a --> 1
## MapDiffRefernce entriesOnlyOnRight() --> Map
d --> 40
A --> 10
## MapDiffRefernce entriesOnlyOnRight() --> Map<K,ValueDifference<V>>
c --> (3, 30) :: leftValue = 3 rightValue = 30