簡體   English   中英

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

[英]How can I make an iterator that never ends?

我只是想知道無限迭代集合的最簡單方法是什么,即當它到達終點時next(); 調用第一個 object。我假設這不是 Java 中已經預定義的 function,所以只是在 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();
}

嘗試EndlessIteratorCactoos

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

它將永遠返回"John" ,永遠不會結束。

另外,檢查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 = 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()方法,但如果需要可以輕松添加。 它也不是線程安全的。

標准 JDK:

Iterable<String> infinite = Stream.generate(names.stream()).flatMap(e -> e).iterator()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM