package edu.berkeley.nlp.util; import java.util.*; /** * Concatenates an iterator over iterators into one long iterator. * * @author Dan Klein */ public class ConcatenationIterator<E> implements Iterator<E> { Iterator<Iterator<E>> sourceIterators; Iterator<E> currentIterator; Iterator<E> lastIteratorToReturn; public boolean hasNext() { if (currentIterator.hasNext()) return true; return false; } public E next() { if (currentIterator.hasNext()) { E e = currentIterator.next(); lastIteratorToReturn = currentIterator; advance(); return e; } throw new NoSuchElementException(); } private void advance() { while (! currentIterator.hasNext() && sourceIterators.hasNext()) { currentIterator = sourceIterators.next(); } } public void remove() { if (lastIteratorToReturn == null) throw new IllegalStateException(); currentIterator.remove(); } public ConcatenationIterator(Iterator<Iterator<E>> sourceIterators) { this.sourceIterators = sourceIterators; this.currentIterator = (new ArrayList<E>()).iterator(); this.lastIteratorToReturn = null; advance(); } public ConcatenationIterator(Collection<Iterator<E>> iteratorCollection) { this(iteratorCollection.iterator()); } public static void main(String[] args) { List<String> list0 = Collections.emptyList(); List<String> list1 = Arrays.asList("a b c d".split(" ")); List<String> list2 = Arrays.asList("e f".split(" ")); List<Iterator<String>> iterators = new ArrayList<Iterator<String>>(); iterators.add(list1.iterator()); iterators.add(list0.iterator()); iterators.add(list2.iterator()); iterators.add(list0.iterator()); Iterator<String> iterator = new ConcatenationIterator<String>(iterators); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }