Exemplo n.º 1
0
  public ResultItem<T>[] getMergedResult() {
    Insertion[] insertedByA = new Insertion[base.length + 1];
    boolean[] deletedByA = new boolean[base.length];
    Insertion[] insertedByB = new Insertion[base.length + 1];
    boolean[] deletedByB = new boolean[base.length];

    Diff aDiff = new Diff(base, a);
    Diff.change aChanges = aDiff.diff_2(false);
    recordChanges(insertedByA, deletedByA, aChanges);

    Diff bDiff = new Diff(base, b);
    Diff.change bChanges = bDiff.diff_2(false);
    recordChanges(insertedByB, deletedByB, bChanges);

    List<ResultItem> result = new ArrayList<ResultItem>();
    InsertedItemFactory<T> aFactory = new InsertedItemFactoryA();
    InsertedItemFactory<T> bFactory = new InsertedItemFactoryB();
    int aPos = 0;
    int bPos = 0;

    for (int i = 0; i <= base.length; i++) {
      if (insertedByA[i] != null) aPos = addInsertions(result, insertedByA[i], aFactory);
      if (insertedByB[i] != null) bPos = addInsertions(result, insertedByB[i], bFactory);

      if (i < base.length) {
        ResultItem<T> item = new ResultItem<T>(base[i], i, -1, -1);
        if (deletedByA[i] == false) item.aPos = aPos++;
        if (deletedByB[i] == false) item.bPos = bPos++;
        result.add(item);
      }
    }

    return (ResultItem<T>[]) result.toArray(new ResultItem[result.size()]);
  }