Wie kann ich einen Iterator machen, die niemals endet?
Frage
Ich frage mich, was der einfachste Weg, eine unbestimmte Zeit eingestellt iterieren, das heißt, wenn das Ende erreicht er next();
das erste Objekt aufruft. Ich gehe davon aus, dass dies nicht eine bereits vordefinierte Funktion in Java, so dass nur für den einfachste Weg, um dies in Java zu implementieren.
Lösung
Es gibt ein Verfahren, in dem ausgezeichneten Google Sammlungen Bibliothek, die dies tut:
Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);
(Ich kann nicht die Google-Sammlungen Bibliothek stark genug empfehlen. Es ist sehr schwer wiegt. Ich bin voreingenommen, wie ich für Google arbeiten, aber ich denke, so ziemlich jeder Googler Schreiben Java würden Sie sagen, wie nützlich die Sammlungen sind.)
Andere Tipps
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
Versuchen Sie EndlessIterator
aus Cactoos :
Iterator<String> names = new EndlessIterator<>("John");
Es wird immer "John"
zurückkehren und wird niemals enden.
Überprüfen Sie auch EndlessIterable
, die Iterable
und macht das gleiche.
Wenn Sie den Iterator machen, in der nächsten Methode können Sie ein, wenn die Bedingung, die überprüft, ob ein anderes Objekt in der Liste gibt. Wenn ja, dann kehren Sie das Objekt, wenn es ist nicht dann gehen Sie an den Anfang der Liste zurück und das Objekt zurück.
Dies ist, was kann ich mir vorstellen ...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
Ich denke, was Sie nie Sie wollen helfen, etwas mit Ihrem Iterator tun können, das einfach, aber Sie müssen bei jeder neuen Sache, die Sie im nicht mit diesem Stil verwendet hinzufügen seien Sie vorsichtig, aber das ist, was wollen Sie aber:
if (! It.hasNext ()) { while (It.hasPrevious ()) { It = It.Previous (); } } Else { It = It.Next (); }
Auf diese Weise ist nichts, wenn Ihr wirklich interessiert Sie stattdessen nächsten Zeiger des letzten zum ersten immer machen sollte, wenn eine neue Liste drücken.
Wie wäre es?
List<String> list = // ArraysList
Interator<String> it = null;
while(true) {
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
Wenn Sie nicht wollen, Guava verwenden wollen aber trotzdem eine wiederverwendbare Lösung:
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();
}
}
Hinweis: Dies ist nicht die Methode remove () nicht unterstützt, aber es leicht hinzugefügt werden könnte, wenn nötig. es ist auch nicht Thread-sicher.