代码之家  ›  专栏  ›  技术社区  ›  Bobby

如何生成一个永不结束的迭代器?

  •  8
  • Bobby  · 技术社区  · 16 年前

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

    8 回复  |  直到 7 年前
        1
  •  36
  •   kdb    7 年前

    有一个方法在优秀 Google Collections 执行此操作的库:

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

    (我不能强烈推荐谷歌收藏库。它非常坚硬。当我为谷歌工作时,我有偏见,但我认为几乎每个Google编写Java都会告诉你这些集合是多么有用。

        2
  •  5
  •   AlexC    16 年前
    Iterator it = mylist.iterator();
    while (it.hasNext())
    {
      MyType t = (MyType)it.next();
    
      // do something
    
      if (!it.hasNext())
        it = mylist.iterator();
    }
    
        3
  •  2
  •   yegor256    8 年前

    尝试 EndlessIterator Cactoos :

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

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

    此外,检查 EndlessIterable ,实现 Iterable 做同样的事。

        4
  •  1
  •   mnuzzo    16 年前

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

        5
  •  1
  •   Bobby    16 年前

    这就是我能想到的……

    iterator = set.getIterator
    //other code
    if (iterator.hasNext())
        //do code here
    else
        iterator = set.getIterator();
    
        6
  •  0
  •   Malid    15 年前

    我认为你想要的永远不会帮助你用迭代器做任何简单的事情,但是你必须小心你添加的任何新东西我不使用这种样式,但是这是你想要的:

    如果(!)HasNeXT() { while(it.hasPrevious()) { it=it.previous(); } }否则{ 它= IT.NEXT(); }

    如果您真的感兴趣,那么在推一个新列表时,应该始终将最后一个指向第一个的下一个指针指向第一个。

        7
  •  0
  •   bluelurker    9 年前

    怎么样?

    List<String> list = // ArraysList
    Interator<String> it = null;
    
    while(true) {
     it = list.iterator();
     while(it.hasNext()) {
       System.out.println(it.next());
     }
    }
    
        8
  •  0
  •   Emanuel Moecklin    8 年前

    如果您不想使用番石榴,但仍然想要一个可重用的解决方案:

    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()方法,但是如果需要,可以很容易地添加它。而且它不是线程安全的。