http://blog.zaq.ne.jp/oboe2uran/article/373/
に追加するメソッドとして以下のように、マージのメソッドを用意する。
/**
* 左 List → 右 List マージ.
* 右 List size > 左 List size で実行時に意味がある。
* 戻り値 左 List size になることを期待する場合、本メソッドを実行する必要がない
*/
@SuppressWarnings("unchecked")
public List<E> mergeLeftToRight(){
List<E> rtn = new ArrayList<E>();
Set<ListDifference<E>> vset = new TreeSet<ListDifference<E>>();
for(Object o : this.map.get(ListyDiffType.COMMON)){
vset.add*1{
ListDifference<E> ld = (ListDifference<E>)o;
vset.add(new ListDifference<E>(ld.getIndex(),ld.leftValue(),ld.leftValue()));
}
for(Object o : this.map.get(ListyDiffType.ONLY_RIGHT)){
vset.add*2;
}
return rtn;
}
/**
* 右 List → 左 List マージ.
* 左 List size > 右 List size で実行時に意味がある。
* 戻り値 右 List size になることを期待する場合、本メソッドを実行する必要がない
*/
@SuppressWarnings("unchecked")
public List<E> mergeRightToLeft(){
List<E> rtn = new ArrayList<E>();
Set<ListDifference<E>> vset = new TreeSet<ListDifference<E>>();
for(Object o : this.map.get(ListyDiffType.COMMON)){
vset.add*3{
ListDifference<E> ld = (ListDifference<E>)o;
vset.add(new ListDifference<E>(ld.getIndex(),ld.rightValue(),ld.rightValue()));
}
for(Object o : this.map.get(ListyDiffType.ONLY_LEFT)){
vset.add*4;
}
return rtn;
}
--------------- Listy のコンストラクタ ----------------
public final class Listy<E>{
private Map<ListyDiffType,Collection<?>> map;
/**
* コンストラクタ
* @param left 左側 java.util.List
* @param right 右側 java.util.List
*/
public Listy(List<E> left,List<E> right){
this.map = new HashMap<ListyDiffType,Collection<?>>();
Set<ListDifference<E>> setDiff = new TreeSet<ListDifference<E>>();
Set<ListDifference<E>> setCommon = new TreeSet<ListDifference<E>>();
Set<ListDifference<E>> setLeft = new TreeSet<ListDifference<E>>();
Set<ListDifference<E>> setRight = new TreeSet<ListDifference<E>>();
Map<Long,E> lmap = new HashMap<Long,E>();
Map<Long,E> rmap = new HashMap<Long,E>();
long ix = 0;
for(E e : left){
lmap.put(new Long(ix),e);
ix++;
}
ix = 0;
for(E e : right){
rmap.put(new Long(ix),e);
ix++;
}
MapDifference<Long,E> mdiff = Maps.difference(lmap,rmap);
Map<Long,ValueDifference<E>> vmap = mdiff.entriesDiffering();
for(final Long lx : vmap.keySet()){
ValueDifference<E> vdiff = vmap.get(lx);
setDiff.add(new ListDifference<E>(lx,vdiff.leftValue(),vdiff.rightValue()));
}
Map<Long,E> vlmap = mdiff.entriesOnlyOnLeft();
for(Long lx : vlmap.keySet()){
setLeft.add(new ListDifference<E>(lx,vlmap.get(lx),null));
}
Map<Long,E> vrmap = mdiff.entriesOnlyOnRight();
for(Long lx : vrmap.keySet()){
setRight.add(new ListDifference<E>(lx,null,vrmap.get(lx)));
}
Map<Long,E> mapCommon = mdiff.entriesInCommon();
for(final Long lx : mapCommon.keySet()){
setCommon.add(new ListDifference<E>(lx,mapCommon.get(lx),mapCommon.get(lx)));
}
this.map.put(ListyDiffType.DIFFERING,setDiff);
this.map.put(ListyDiffType.COMMON,setCommon);
this.map.put(ListyDiffType.ONLY_LEFT,setLeft);
this.map.put(ListyDiffType.ONLY_RIGHT,setRight);
}
enum ListyDiffType{
DIFFERING,COMMON,ONLY_LEFT,ONLY_RIGHT
}
*1:ListDifference<E>)o);
}
for(Object o : this.map.get(ListyDiffType.DIFFERING
*2:ListDifference<E>)o);
}
for(ListDifference<E> ld : vset){
rtn.add(ld.rightValue(
*3:ListDifference<E>)o);
}
for(Object o : this.map.get(ListyDiffType.DIFFERING
*4:ListDifference<E>)o);
}
for(ListDifference<E> ld : vset){
rtn.add(ld.leftValue(