List の マージ

List のDiff 処理ができたなら、当然マージ処理も用意してみたくなる。
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(