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