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

有帮助吗?

解决方案

优秀的 Google Collections 库中有一种方法可以执行此操作:

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

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

其他提示

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

  // do something

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

尝试 EndlessIterator Cactoos 的代码> :

Iterator<String> names = new EndlessIterator<>("John");

它将始终返回&quot; John&quot; 并永远不会结束。

另外,请查看 EndlessIterable ,实现 Iterable 并执行相同的操作。

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

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

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

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

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

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

怎么样?

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

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

如果您不想使用Guava但仍需要可重复使用的解决方案:

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()方法,但如果需要可以轻松添加。它也不是线程安全的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top