Question

Je me demandais simplement quel était le moyen le plus facile de parcourir un ensemble indéfiniment, c'est-à-dire que, quand il atteindrait la fin, next (); appelle le premier objet. Je suppose que ceci n’est pas une fonction déjà prédéfinie en Java, alors cherchez simplement le moyen le plus simple de l’implémenter en Java.

Était-ce utile?

La solution

Il existe une méthode dans l'excellente bibliothèque Google Collections qui effectue cette opération:

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

(Je ne peux pas trop recommander la bibliothèque Google Collections. Elle bascule très fort. Je suis partisan de mon travail pour Google, mais je pense que tous les Googler qui écrivent en Java vous diraient à quel point les collections sont utiles.)

Autres conseils

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

  // do something

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

Essayez EndlessIterator sur Cactoos :

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

Il renverra toujours "John" & et ne se terminera jamais.

Vérifiez également EndlessIterable , qui implémente Iterable et fait de même.

Si vous créez l'itérateur, dans la méthode suivante, vous pouvez avoir une condition if qui vérifie s'il y a un autre objet dans la liste. Si tel est le cas, vous renvoyez cet objet. S'il n'y en a pas, vous revenez au début de la liste et vous le retournez.

C’est ce à quoi je peux penser ...

iterator = set.getIterator
//other code
if (iterator.hasNext())
    //do code here
else
    iterator = set.getIterator();

Je pense que ce que vous voulez ne jamais aider Vous pouvez faire quelque chose de facile avec votre itérateur, mais vous devez faire attention à toute nouvelle chose que vous ajoutez ne suis pas utilisée avec ce style, mais voici ce que vous voulez:

if (! It.hasNext ()) { tandis que (It.hasPrevious ()) { It = It.Previous (); } } autre { It = It.Next (); }

Cette façon de faire n’est rien si vous êtes vraiment intéressé, vous devriez toujours placer le pointeur suivant du dernier au dernier toujours lorsque vous insérez une nouvelle liste.

Qu'en est-il?

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

while(true) {
 it = list.iterator();
 while(it.hasNext()) {
   System.out.println(it.next());
 }
}

Si vous ne souhaitez pas utiliser Guava mais souhaitez tout de même une solution réutilisable:

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();
    }
}

Remarque: ceci ne prend pas en charge la méthode remove () mais peut être facilement ajouté si nécessaire. En outre, ce n'est pas thread-safe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top