2009-06-19 9 views
7

Me preguntaba cuál es la forma más fácil de iterar en un conjunto indefinidamente, es decir, cuando llega al final next(); llama al primer objeto. Asumo que esto no es una función ya predefinida en Java, así que solo estoy buscando la forma más fácil de implementar esto en Java.¿Cómo puedo hacer un iterador que nunca termina?

+0

¿Qué podría ser un requisito para esto? Si solo quieres repetir algunos elementos para siempre, ¿por qué usar Iterator? – Khangharoth

+0

Si solo estuviera usando el iterador para acceder a los objetos a través de un ciclo while, entonces no tendría sentido, pero no lo estoy, así que utilizo un iterador ya que es lo mejor para lo que quiero hacer. –

Respuesta

31

Hay un método en el excelente Google Collections biblioteca que hace esto:

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

(no puedo recomendar la biblioteca de Google Colecciones con fuerza. Es muy difícil. Soy parcial ya que trabajo para Google, pero creo que casi todos los Googler que escriben Java dirían cuán útiles son las colecciones.)

+0

+1 para Iterables.cycle – coobird

+0

Este es un método realmente genial. –

1

Si está haciendo el iterador, en el siguiente método puede tener una condición if que verifique si hay otro objeto en la lista. Si lo hay, devuelve ese objeto; si no lo hay, vuelve al comienzo de la lista y devuelve ese objeto.

+0

Entiendo que publicó su respuesta antes que la mía, pero como he visto en mi respuesta, eso es lo que básicamente estoy haciendo ahora, me preguntaba si había una mejor manera que crear un nuevo objeto Iterator cada vez que llego al final –

0

Esto es lo que se me ocurre ...

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

Eso también parece estar bien –

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

    // do something 

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

¿No es esto un ciclo infinito? –

+0

No, .next avanza el iterador. – AlexC

+0

Ya, pero en la parte inferior, reemplace 'it' con un nuevo iterador si' it' está agotado, lo que significa que nunca saldrá del ciclo while ... lo que supongo que es el punto, pero leí mal pregunta y pensó que el OP estaba preguntando cómo * crear * un iterador que itera infinitamente, lo que no funciona –

0

Creo que lo que no quieren ayuda Usted puede hacer cualquier cosa con su iterador que es fácil pero hay que tener cuidado con cualquier cosa nueva se agrega im no se utiliza con este estilo, pero esto es lo que quiere sin embargo:

si (! It.hasNext()) { while (It.hasPrevious()) { It = It.Previous(); } } else { It = It.Next(); }

De esta manera no es nada si realmente le interesa, en su lugar, debe hacer el siguiente puntero del último al primero siempre al presionar una nueva lista.

0

¿Qué tal?

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

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

Si no desea utilizar la guayaba, pero todavía quiere una solución reutilizable:

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

Nota: este no es compatible con el método remove() pero podría ser fácilmente añadidos si es necesario . Además, no es seguro para subprocesos.

Cuestiones relacionadas