Korzystanie Guava'sAbstractIterator
dla uproszczenia:
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();
}
};
To daje pożądany „z przeplotem” porządek, to jest wystarczająco inteligentny, aby radzić sobie ze zbiorów o różnych rozmiarach, i to dość zwarte. (Możesz użyć wartości ArrayDeque
zamiast LinkedList
dla prędkości, zakładając, że korzystasz z Java 6+.)
Jeśli naprawdę, naprawdę nie możesz tolerować innej biblioteki innej firmy, możesz mniej lub bardziej zrobić to samo z jakąś dodatkową pracę, tak:
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(); }
};
Dla porównania, „wszystko iter1 wszystkie iter2, etc” zachowanie można również uzyskać za pomocą Iterators.concat(Iterator<Iterator>)
i jego przeciążenia.
wielu iteratorów do samej kolekcji lub każdego innego iteratora z kolekcji? – kosa
Yikes: http://stackoverflow.com/questions/3610261/is-it-possible-to-merge-iterators-in-java –
@RobertPeters Tak wygląda dupe. flyingfromchina, czy możesz podać przykład tego, co chcesz wyjaśnić pytanie? – daveslab