Как я могу сделать итератор, который никогда не заканчивается?

StackOverflow https://stackoverflow.com/questions/1016605

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

Iterator it = mylist.iterator();
while (it.hasNext())
{
  MyType t = (MyType)it.next();

  // do something

  if (!it.hasNext())
    it = mylist.iterator();
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top