有人知道如何在Java中加入多个迭代器吗?我发现的解决方案首先迭代一个迭代器,然后继续下一个迭代器.但是,我想要的是当next()被调用时,它首先返回第一个迭代器中的第一个元素.下次调用next()时,它将返回第二个迭代器中的第一个元素,依此类推.
谢谢
Lou*_*man 10
使用Guava 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();
}
};
Run Code Online (Sandbox Code Playgroud)
这将为您提供所需的"交错"顺序,它足够智能地处理具有不同大小的集合,并且它非常紧凑.(假设您使用的是Java 6+,您可能希望使用它ArrayDeque来代替LinkedList速度.)
如果你真的,真的不能容忍另一个第三方库,你可以或多或少地做一些额外的工作同样的事情,如下:
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(); }
};
Run Code Online (Sandbox Code Playgroud)
作为参考,也可以使用Iterators.concat(Iterator<Iterator>)及其重载来获得"所有iter1,所有iter2等"行为.
| 归档时间: |
|
| 查看次数: |
9393 次 |
| 最近记录: |