/* * Author: tdanford * Date: Apr 2, 2009 */ package org.seqcode.gseutils; import java.util.*; public class MergingIterator<X extends Comparable<X>> implements Iterator<X> { private ArrayList<Iterator<X>> itrs; private ArrayList<X> pending; public MergingIterator(Iterator<X>... is) { itrs = new ArrayList<Iterator<X>>(); for(int i = 0; i < is.length; i++) { itrs.add(is[i]); } pending = new ArrayList<X>(); for(int i = 0; i < itrs.size(); i++) { pending.add(itrs.get(i).hasNext() ? itrs.get(i).next() : null); } } public boolean hasNext() { for(int i = 0; i < itrs.size(); i++) { if(pending.get(i) != null) { return true; } } return false; } public X next() { int min = -1; for(int i = 0; i < pending.size(); i++) { X val = pending.get(i); if(min == -1 || (val != null && val.compareTo(pending.get(min)) < 0)) { min = i; } } X minVal = min != -1 ? pending.get(min) : null; if(min != -1) { pending.set(min, itrs.get(min).hasNext() ? itrs.get(min).next() : null); } return minVal; } public void remove() { throw new UnsupportedOperationException(); } }