Как я могу сделать итератор, который никогда не заканчивается?
Вопрос
Мне просто интересно, какой самый простой способ перебирать множество бесконечно, т.е. когда он достигает конца, он 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 (), но его можно легко добавить при необходимости. Также это не потокобезопасно.