Как я могу сделать итератор, который никогда не заканчивается? - PullRequest
8 голосов
/ 19 июня 2009

Мне было просто интересно, какой самый простой способ перебирать множество бесконечно, т.е. когда он достигает конца, next(); вызывает первый объект. Я предполагаю, что это не предопределенная функция в Java, поэтому просто ищу самый простой способ реализовать это в Java.

Ответы [ 8 ]

36 голосов
/ 19 июня 2009

В отличной библиотеке Google Collections есть метод, который делает это:

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

(Я не могу рекомендовать библиотеку Google Collections достаточно сильно. Она очень крутая. Я предвзято работаю в Google, но я думаю, что почти каждый Googler, пишущий Java, скажет вам, насколько полезны коллекции.)

5 голосов
/ 19 июня 2009
Iterator it = mylist.iterator();
while (it.hasNext())
{
  MyType t = (MyType)it.next();

  // do something

  if (!it.hasNext())
    it = mylist.iterator();
}
2 голосов
/ 19 июня 2017

Попробуйте EndlessIterator от Cactoos :

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

Он всегда вернет "John" и никогда не закончится.

Также отметьте EndlessIterable, который реализует Iterable и делает то же самое.

1 голос
/ 19 июня 2009

Это то, о чем я могу думать ...

iterator = set.getIterator
//other code
if (iterator.hasNext())
    //do code here
else
    iterator = set.getIterator();
1 голос
/ 19 июня 2009

Если вы создаете итератор, в следующем методе вы можете иметь условие if, которое проверяет, есть ли в списке другой объект. Если есть, вы возвращаете этот объект, а если нет, возвращаетесь к началу списка и возвращаете этот объект.

0 голосов
/ 13 июня 2017

Если вы не хотите использовать 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 (), но его можно легко добавить при необходимости. Также это не потокобезопасно.

0 голосов
/ 25 мая 2016

Как насчет?

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

while(true) {
 it = list.iterator();
 while(it.hasNext()) {
   System.out.println(it.next());
 }
}
0 голосов
/ 22 апреля 2010

Я думаю, что то, что вам нужно, никогда не поможет. С вашим итератором можно сделать все, что угодно, но вы должны быть осторожны с любой новой вещью, которую вы добавляете, но она не используется в этом стиле, но это то, что вы хотите:

if (! It.hasNext ()) { while (It.hasPrevious ()) { It = It.Previous (); } } еще { It = It.Next (); }

Этот способ ничего не значит, если вы действительно заинтересованы, вместо этого вы всегда должны делать следующий указатель от последнего к первому всегда, когда нажимаете новый список.

...