का उपयोग Guava'sAbstractIterator
सादगी के लिए:
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();
}
};
यह आपको वांछित "interleaved" आदेश दे देंगे, यह काफी स्मार्ट संग्रह विभिन्न आकारों होने से निपटने के लिए है, और यह काफी कॉम्पैक्ट है। आप सच में, सच एक और तृतीय-पक्ष लाइब्रेरी को बर्दाश्त नहीं कर सकते हैं (आप यह मानकर कि आप जावा पर हैं 6 + गति के लिए LinkedList
के स्थान पर ArrayDeque
उपयोग कर सकते हैं।)
, आप कम या ज्यादा कर सकते हैं कुछ अतिरिक्त काम करते हैं, तो जैसे के साथ एक ही बात:
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>)
और उसके भार के उपयोग कर प्राप्त किया जा सकता है।
स्रोत
2012-02-08 19:36:31
एकाधिक iterators:
आप एक यौगिक iterator उपयोग करने के लिए, की तरह कुछ की जरूरत है? – kosa
यिक्स: http://stackoverflow.com/questions/3610261/is-it-possible-to-merge-iterators-in-java –
@RobertPeters हाँ एक डुप्ली की तरह दिखता है। flyfromchina, क्या आप इस बात का एक उदाहरण पोस्ट कर सकते हैं कि आप प्रश्न को स्पष्ट करना चाहते हैं? – daveslab