在java中连接多个迭代器

fly*_*ina 12 java iterator

有人知道如何在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等"行为.