package dk.itu.oop.lecture5; import java.util.Iterator; public abstract class MergeIterators implements OOPIterator { private OOPIterator itr1,itr2; private Object nextElement; public MergeIterators(OOPIterator itr1, OOPIterator itr2){ this.itr1 = itr1; this.itr2 = itr2; findNext(); } protected abstract OOPIterator choose(OOPIterator i1, OOPIterator i2); private void findNext(){ nextElement = null; if (itr1.hasNext() && itr2.hasNext() ) nextElement = choose(itr1,itr2).next(); else if ( itr1.hasNext() ) nextElement = itr1.next(); else if ( itr2.hasNext() ) nextElement = itr2.next(); } public boolean hasNext(){ return nextElement != null; } public Object next(){ Object returnMe = nextElement; findNext(); return returnMe; } public Object peek(){ return nextElement; } public OOPIterator cloneMe(){ try{ MergeIterators clone = (MergeIterators)super.clone(); clone.itr1 = itr1.cloneMe(); clone.itr2 = itr2.cloneMe(); return clone; }catch(CloneNotSupportedException shouldNotHappen){ throw new Error("Object claims not to be able to clone"); } } }