package org.limewire.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
/**
* Implements the {@link Iterator} interface.
<pre>
LinkedList<String> l1 = new LinkedList<String>();
l1.add("Abby");
l1.add("Bob");
LinkedList<String> l2 = new LinkedList<String>();
l2.add("Anderson");
l2.add("Baker");
for(MultiIterator<String> miterator =
new MultiIterator<String>(l1.iterator(), l2.iterator());
miterator.hasNext();)
System.out.println(miterator.next());
Output:
Abby
Bob
Anderson
Baker
</pre>
*/
public class MultiIterator<T> implements Iterator<T> {
protected final Iterator<? extends T> [] iterators;
protected int current;
@SuppressWarnings("unchecked")
public MultiIterator(Iterator<? extends T> i1) {
this.iterators = new Iterator[] { i1 };
}
@SuppressWarnings("unchecked")
public MultiIterator(Iterator<? extends T> i1, Iterator<? extends T> i2) {
this.iterators = new Iterator[] { i1, i2 };
}
@SuppressWarnings("unchecked")
public MultiIterator(Iterator<? extends T> i1, Iterator<? extends T> i2, Iterator<? extends T> i3) {
this.iterators = new Iterator[] { i1, i2, i3 };
}
@SuppressWarnings("unchecked")
public MultiIterator(Iterator<? extends T> i1, Iterator<? extends T> i2, Iterator<? extends T> i3, Iterator<? extends T> i4) {
this.iterators = new Iterator[] { i1, i2, i3, i4 };
}
public MultiIterator(Iterator<? extends T>... iterators) {
this.iterators = iterators;
}
@SuppressWarnings("unchecked")
public MultiIterator(Iterable<? extends Iterator<? extends T>> iterators) {
List<Iterator<? extends T>> list = new ArrayList<Iterator<? extends T>>();
for(Iterator<? extends T> iterator : iterators) {
list.add(iterator);
}
this.iterators = list.toArray(new Iterator[list.size()]);
}
public void remove() {
if (iterators.length == 0)
throw new IllegalStateException();
iterators[current].remove();
}
public boolean hasNext() {
for (Iterator<? extends T> iterator : iterators) {
if (iterator.hasNext())
return true;
}
return false;
}
public T next() {
if (iterators.length == 0)
throw new NoSuchElementException();
positionCurrent();
return iterators[current].next();
}
protected void positionCurrent() {
while (!iterators[current].hasNext() && current < iterators.length)
current++;
}
}