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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top