【问题标题】:How can I make an iterator that never ends?如何制作一个永不结束的迭代器?
【发布时间】:2010-11-04 05:38:13
【问题描述】:

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

【问题讨论】:

  • 这可能有什么要求。如果你只想永远循环一些元素,那么为什么要使用迭代器?
  • 如果我只使用迭代器通过 while 循环访问对象,那么没有意义,但我不是,所以我使用迭代器,因为它最适合我想要的去做。

标签: java iterator infinite


【解决方案1】:

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

【讨论】:

  • 我知道您在我之前发布了您的答案,但是从我的答案中可以看出,这就是我现在基本上正在做的事情,我只是想知道是否有比每次实例化一个新的 Iterator 对象更好的方法当我走到尽头的时候
【解决方案2】:

这是我能想到的……

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    【解决方案4】:
    Iterator it = mylist.iterator();
    while (it.hasNext())
    {
      MyType t = (MyType)it.next();
    
      // do something
    
      if (!it.hasNext())
        it = mylist.iterator();
    }
    

    【讨论】:

    • 这不是无限循环吗?
    • 不,.next 推进迭代器。
    • 是的,但是在底部,如果 it 已耗尽,则将 it 替换为新的迭代器,这意味着您将永远不会退出 while 循环......我猜这是整点,但我误读了这个问题,并认为 OP 是在问如何 create 一个无限循环的迭代器,这不是
    【解决方案5】:

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

    if (! It.hasNext() ) { 而 ( It.hasPrevious() ) { It = It.Previous(); } } 别的 { It = It.Next(); }

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

    【讨论】:

      【解决方案6】:

      怎么样?

      List<String> list = // ArraysList
      Interator<String> it = null;
      
      while(true) {
       it = list.iterator();
       while(it.hasNext()) {
         System.out.println(it.next());
       }
      }
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          Cactoos 尝试EndlessIterator

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

          它将始终返回"John",并且永远不会结束。

          另外,检查EndlessIterable,它实现了Iterable 并执行相同的操作。

          【讨论】:

            猜你喜欢
            • 2020-11-07
            • 2014-08-07
            • 1970-01-01
            • 2012-08-16
            • 1970-01-01
            • 2010-11-06
            • 1970-01-01
            • 1970-01-01
            • 2019-08-23
            相关资源
            最近更新 更多