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()]); }