Usando Guava'sAbstractIterator
por simplicidad:
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();
}
};
Esto le dará la orden "entrelazado" deseado, es lo suficientemente inteligente como para hacer frente a las colecciones que tienen diferentes tamaños, y es bastante compacto. (Puede usar ArrayDeque
en lugar de LinkedList
para obtener velocidad, suponiendo que está en Java 6+.)
Si realmente no puede tolerar otra biblioteca de terceros, puede hacer más o menos lo mismo lo mismo con un poco de trabajo adicional, así:
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(); }
};
como referencia, el "todos iter1, todos iter2, etc" comportamiento puede también obtenerse utilizando Iterators.concat(Iterator<Iterator>)
y sus sobrecargas.
iteradores múltiples a misma colección o cada iterador de diferentes colección? – kosa
Yikes: http://stackoverflow.com/questions/3610261/is-it-possible-to-merge-iterators-in-java –
@RobertPeters Sí parece un tonto. flyingfromchina, ¿puedes publicar un ejemplo de lo que quieres aclarar? – daveslab