/** Generic merge for sorted sequences. */ public abstract class Merger { private Object a, b; // current elements in A and B private ObjectIterator iterA, iterB; // iterators for A and B /** Generic merge template method */ public void merge(Sequence A, Sequence B, Comparator comp, Sequence C) { iterA = A.elements(); iterB = B.elements(); boolean aExists = advanceA(); // Boolean test if there is a current a boolean bExists = advanceB(); // Boolean test if there is a current b while (aExists && bExists) { // Main loop for merging a and b if (comp.isLessThan(a, b)) { aIsLess(a, C); aExists = advanceA(); } else if (comp.isEqualTo(a, b)) { bothAreEqual(a, b, C); aExists = advanceA(); bExists = advanceB(); } else { bIsLess(b, C); bExists = advanceB(); } } while (aExists) { aIsLess(a, C); aExists = advanceA(); } while (bExists) { bIsLess(b, C); bExists = advanceB(); } } // auxiliary methods to be specialized by subclasses protected void aIsLess(Object a, Sequence C) { } protected void bothAreEqual(Object a, Object b, Sequence C) { } protected void bIsLess(Object b, Sequence C) { } // helper methods private boolean advanceA() { if (iterA.hasNext()) { a = iterA.nextObject(); return true; } return false; } private boolean advanceB() { if (iterB.hasNext()) { b = iterB.nextObject(); return true; } return false; } }