Sử dụng Guava'sAbstractIterator
vì đơn giản:
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();
}
};
này sẽ cung cấp cho bạn những mong muốn "xen kẽ" trật tự, nó đủ thông minh để đối phó với những bộ sưu tập có kích cỡ khác nhau, và nó khá nhỏ gọn. (Bạn có thể muốn sử dụng ArrayDeque
thay cho số LinkedList
cho tốc độ, giả sử bạn đang sử dụng Java 6+.)
Nếu bạn thực sự, không thể chịu đựng được thư viện của bên thứ ba khác, bạn có thể làm nhiều hơn hoặc ít hơn điều tương tự với một số công việc bổ sung, như vậy:
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(); }
};
để tham khảo, "tất cả các iter1, tất cả iter2, vv" hành vi cũng có thể thu được bằng Iterators.concat(Iterator<Iterator>)
và quá tải của nó.
Nguồn
2012-02-08 19:36:31
Nhiều lặp với cùng bộ sưu tập hoặc từng iterator từ bộ sưu tập khác nhau? – kosa
Yikes: http://stackoverflow.com/questions/3610261/is-it-possible-to-merge-iterators-in-java –
@RobertPeters Yeah trông giống như một bản dupe. flyingfromchina, bạn có thể đăng một ví dụ về những gì bạn muốn làm rõ câu hỏi? – daveslab