12

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

4

8 回答 8

41

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

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

(我不能强烈推荐 Google Collections 库。它非常困难。我在为 Google 工作时有偏见,但我认为几乎每个编写 Java 的 Google 人都会告诉你这些集合有多么有用。)

于 2009-06-19T06:47:04.157 回答
6
Iterator it = mylist.iterator();
while (it.hasNext())
{
  MyType t = (MyType)it.next();

  // do something

  if (!it.hasNext())
    it = mylist.iterator();
}
于 2009-06-19T11:55:25.367 回答
2

EndlessIteratorCactoos尝试:

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

它会永远回来"John",永远不会结束。

此外, check EndlessIterable,它实现Iterable并执行相同的操作。

于 2017-06-19T09:04:25.863 回答
1

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

于 2009-06-19T06:31:09.563 回答
1

这是我能想到的...

iterator = set.getIterator
//other code
if (iterator.hasNext())
    //do code here
else
    iterator = set.getIterator();
于 2009-06-19T06:32:11.027 回答
0

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

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

如果您真的有兴趣,那么这种方式没什么用,您应该在推送新列表时始终将最后一个指针指向第一个指针。

于 2010-04-21T21:51:18.427 回答
0

怎么样 ?

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

while(true) {
 it = list.iterator();
 while(it.hasNext()) {
   System.out.println(it.next());
 }
}
于 2016-05-25T05:55:57.277 回答
0

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

于 2017-06-13T18:45:21.823 回答