Использование Гуавы AbstractIterator
для простоты:
final List<Iterator<E>> theIterators;
return new AbstractIterator<E>() {
private Queue<Iterator<E>> queue = new LinkedList<Iterator<E>>(theIterators);
@Override protected E computeNext() {
while(!queue.isEmpty()) {
Iterator<E> topIter = queue.poll();
if(topIter.hasNext()) {
E result = topIter.next();
queue.offer(topIter);
return result;
}
}
return endOfData();
}
};
Это даст вам желаемый «чередующийся» порядок, он достаточно умен для работы с коллекциями разных размеров и достаточно компактен. (Вы можете использовать ArrayDeque
вместо LinkedList
для скорости, при условии, что вы на Java 6+.)
Если вы действительно, действительно не можете терпеть другую стороннюю библиотеку, вы можете более или менее сделать то же самое с некоторой дополнительной работой, например:
return new Iterator<E>() {
private Queue<Iterator<E>> queue = new LinkedList<Iterator<E>>(theIterators);
public boolean hasNext() {
// If this returns true, the head of the queue will have a next element
while(!queue.isEmpty()) {
if(queue.peek().hasNext()) {
return true;
}
queue.poll();
}
return false;
}
public E next() {
if(!hasNext()) throw new NoSuchElementException();
Iterator<E> iter = queue.poll();
E result = iter.next();
queue.offer(iter);
return result;
}
public void remove() { throw new UnsupportedOperationException(); }
};
Для справки, поведение "все из iter1, все из iter2 и т. Д." Также можно получить с помощью Iterators.concat(Iterator<Iterator>)
и его перегрузок.