如何制作永不结束的迭代器?

时间:2009-06-19 06:29:47

标签: java iterator infinite

我只是想知道无限期地迭代一个集合的最简单方法是什么,即当它到达结尾时next();调用第一个对象。我假设这不是Java中已经预定义的函数,所以只是寻找在Java中实现它的最简单方法。

8 个答案:

答案 0 :(得分:36)

优秀的Google Collections库中有一个方法可以做到这一点:

Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);

(我不能足够强烈推荐Google Collections库。它非常努力。我在为Google工作时有偏见,但我认为几乎每个编写Java的Googler都会告诉你这些收藏品有多么有用。)

答案 1 :(得分:5)

Iterator it = mylist.iterator();
while (it.hasNext())
{
  MyType t = (MyType)it.next();

  // do something

  if (!it.hasNext())
    it = mylist.iterator();
}

答案 2 :(得分:2)

EndlessIterator尝试Cactoos

root    'quotes#new'

它将始终返回Iterator<String> names = new EndlessIterator<>("John"); 并永远不会结束。

另外,请检查EndlessIterable,它实现"John"并执行相同操作。

答案 3 :(得分:1)

如果你正在创建迭代器,在下一个方法中你可以有一个if条件来检查列表中是否有另一个对象。如果有,则返回该对象,如果没有,则返回列表的开头并返回该对象。

答案 4 :(得分:1)

这是我能想到的......

iterator = set.getIterator
//other code
if (iterator.hasNext())
    //do code here
else
    iterator = set.getIterator();

答案 5 :(得分:0)

我认为你想要的东西永远不会帮助你可以用你的迭代器做任何事情都很容易,但是你必须小心你添加的任何新东西我不喜欢这种风格,但这是你想要的:

if(!It.hasNext()) { 而(It.hasPrevious()) { 它= It.Previous(); } } else { 它= It.Next(); }

如果您真正感兴趣的话,这种方式就没有了,而是在推送新列表时总是将下一个指针指向第一个指针。

答案 6 :(得分:0)

怎么样?

List<String> list = // ArraysList
Interator<String> it = null;

while(true) {
 it = list.iterator();
 while(it.hasNext()) {
   System.out.println(it.next());
 }
}

答案 7 :(得分:0)

如果您不想使用番石榴但仍想要可重复使用的解决方案:

public static class CyclicIterator<E, C extends Collection<E>> implements Iterator<E> {
    final private C mElements;
    private Iterator<E> mIterator;

    public CyclicIterator(C elements) {
        mElements = elements;
        mIterator = elements.iterator();
    }

    @Override
    public boolean hasNext() {
        if (! mIterator.hasNext()) {
            mIterator = mElements.iterator();
        }
        return mIterator.hasNext();
    }

    @Override
    public E next() {
        if (! mIterator.hasNext()) {
            mIterator = mElements.iterator();
        }
        return mIterator.next();
    }
}

注意:这不支持remove()方法,但如果需要可以轻松添加。它也不是线程安全的。