我只是想知道无限期地迭代一个集合的最简单方法是什么,即当它到达末尾时它next();
调用第一个对象。我假设这不是 Java 中已经预定义的函数,所以只是寻找在 Java 中实现它的最简单方法。
8 回答
优秀的Google Collections库中有一个方法可以做到这一点:
Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);
(我不能强烈推荐 Google Collections 库。它非常困难。我在为 Google 工作时有偏见,但我认为几乎每个编写 Java 的 Google 人都会告诉你这些集合有多么有用。)
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
Iterator<String> names = new EndlessIterator<>("John");
它会永远回来"John"
,永远不会结束。
此外, check EndlessIterable
,它实现Iterable
并执行相同的操作。
如果您正在创建迭代器,则在下一个方法中,您可以使用 if 条件来检查列表中是否存在另一个对象。如果有,则返回该对象,如果没有,则返回列表的开头并返回该对象。
这是我能想到的...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
我认为你想要的永远不会帮助你可以用你的迭代器做任何事情,这很容易,但你必须小心你添加的任何新东西,我不使用这种风格,但这就是你想要的:
if (! It.hasNext() ) { while ( It.hasPrevious() ) { It = 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() 方法,但如果需要可以轻松添加。它也不是线程安全的。