2009-06-19 6 views
7

Mi stavo chiedendo quale sia il modo più semplice per scorrere su un set indefinitamente, cioè quando raggiunge la fine, lo next(); chiama il primo oggetto. Presumo che questa non sia una funzione già predefinita in Java, quindi è sufficiente cercare il modo più semplice per implementarlo in Java.Come posso creare un iteratore che non finisce mai?

+0

Quale potrebbe essere il requisito per questo.Se si desidera semplicemente interrompere per sempre alcuni elementi, quindi perché utilizzare Iterator? – Khangharoth

+0

Se stavo usando l'iteratore solo per accedere agli oggetti tramite un ciclo while, non ci sarebbe alcun punto, ma io non sono così io uso un iteratore in quanto è la soluzione migliore per quello che voglio fare. –

risposta

31

c'è un metodo nella eccellente Google Collections biblioteca che fa questo:

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

(non posso raccomandare la libreria di Google Collezioni Ho abbastanza diesis, mi fa molto male, sono prevenuto mentre lavoro per Google, ma penso che ogni Googler che scrive Java possa dirti quanto siano utili le collezioni.)

+0

+1 per Iterables.cycle – coobird

+0

Questo è un metodo davvero interessante. –

1

Se si sta eseguendo l'iteratore, nel metodo successivo è possibile avere una condizione if che controlli se c'è un altro oggetto nell'elenco. Se c'è, allora restituisci quell'oggetto, se non c'è, allora torni all'inizio della lista e restituisci quell'oggetto.

+0

Capisco che tu abbia postato la tua risposta prima della mia, ma come visto nella mia risposta è quello che sto facendo in questo momento, mi chiedevo solo se ci fosse un modo migliore di creare un nuovo oggetto Iterator ogni volta che arrivo alla fine –

0

Questo è quello che mi viene in mente ...

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

Anche questo sembra ok –

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

    // do something 

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

Non è un ciclo infinito? –

+0

No, .next fa avanzare l'iteratore. – AlexC

+0

Ya, ma nella parte inferiore, si sostituisce 'it' con un nuovo iteratore se' it' è esaurito, il che significa che non si uscirà mai dal ciclo while ... che immagino sia l'intero punto, ma ho letto male il domanda e pensavo che l'OP chiedesse come * creare * un iteratore che scorre infinitamente, cosa che questo non fa –

0

Penso che ciò che si desidera mai aiuto si può fare qualsiasi cosa con il tuo iteratore che è facile, ma si deve essere attenti a qualsiasi cosa nuova si aggiunge im non utilizzato con questo stile, ma questo è ciò che si vuole però:

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

In questo modo non è niente se sei davvero interessato, dovresti invece puntare il prossimo puntatore dell'ultimo al primo sempre quando si spinge una nuova lista.

0

Che ne dici?

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

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

Se non si desidera utilizzare Guava, ma vuole ancora una soluzione riutilizzabile:

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: questo non supporta il metodo remove(), ma potrebbe facilmente essere aggiunto, se necessario . Inoltre non è thread-safe.

1

Prova EndlessIterator da Cactoos:

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

Sarà sempre tornare "John" e non avrà mai fine.

Inoltre, controllare EndlessIterable, che implementa Iterable e fa lo stesso.