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?
risposta
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.)
+1 per Iterables.cycle – coobird
Questo è un metodo davvero interessante. –
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.
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 –
Questo è quello che mi viene in mente ...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
Anche questo sembra ok –
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
Non è un ciclo infinito? –
No, .next fa avanzare l'iteratore. – AlexC
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 –
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.
Che ne dici?
List<String> list = // ArraysList
Interator<String> it = null;
while(true) {
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
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.
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.
Quale potrebbe essere il requisito per questo.Se si desidera semplicemente interrompere per sempre alcuni elementi, quindi perché utilizzare Iterator? – Khangharoth
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. –