2012-12-03 17 views
27

Ho bisogno di sapere come "resettare" l'iteratore LinkedList sul suo primo elemento.java-reset elenco iteratore al primo elemento della lista

Ad esempio:

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

Più e più volte e dopo molte mosse del iteratore ho bisogno di posizione di "reset" di iteratore. `

voglio chiedere come posso "resettare" il mio iteratore al primo elemento

So che posso ottenere l'elenco iteratore del primo elemento in questo modo:

iter= list.listIterator(1);

È questa la soluzione migliore? o forse mi sono perso qualcosa nei documenti Oracle?

+0

Perché non creare un nuovo iteratore? – reprogrammer

+1

beh, ti sei perso qualcosa, se hai bisogno di fare più del prossimo e forse precedente, l'iteratore non è la scelta migliore. Perché devi resettare? –

+0

Sto cercando di capire l'idea dell'elenco dinamico in java. Qualche settimana fa ho avuto un problema con la variabile di sessione su jsp oage. Da EL e taglibs posso usare un metodo di iteratore ma non posso ridefinirlo (ho ancora scarsa conoscenza di jsp, ma ho ancora migliorarlo :)) Cosa ti dispiace quando hai scritto "iteratore non è la scelta migliore"? Potresti spiegarmelo? :) – ognistysztorm

risposta

16

migliore sarebbe quella di non usare LinkedList a tutti, di solito è più lento in tutte le discipline, e meno a portata di mano. (Nell'inserire principalmente/cancellazione al fronte, in particolare per i grandi array LinkedList è più veloce)

Uso ArrayList, e scorrere con

int len = list.size(); 
for (int i = 0; i < len; i++) { 
    Element ele = list.get(i); 
} 

Reset è ancora banale, solo ciclo.
Se ti ostini a usare un iteratore, quindi è necessario utilizzare un nuovo iteratore:

iter = list.listIterator(); 

(ho visto solo una volta nella mia vita un vantaggio di LinkedList: ho potuto scorrere whith un ciclo while e rimuovere la primo elemento)

+4

durante l'eliminazione e l'inserimento principalmente a fronte poi LinkedList è più veloce. – raceworm

+0

Anche la rimozione di elementi dal centro è più veloce in caso di LinkedList. Cioè se stai iterando e rimuovendo gli articoli con iterator.remove(). ArrayList richiederebbe lo spostamento degli elementi rimanenti. – Sohaib

+0

@Sohaib, sì principalmente dipende dalla dimensione della lista. Fino a un numero specifico di elementi System.arraycopy, che usa C - memcopy, che viene utilizzato per spostare la matrice è più veloce. L'implementazione avanzata cambia l'implementazione sottostante declassando sulla dimensione dell'elemento. – AlexWien

34

È possibile chiamare listIterator metodo nuovo per ottenere un esempio di iteratore che punta a inizio lista:

iter = list.listIterator(); 
+3

fantastico. non è immediatamente ovvio che questa chiamata non restituisca solo lo stesso riferimento all'iteratore che stai già utilizzando. Ma immagino che esaminare la fonte avrebbe risolto anche quella risposta. Ecco un link per chiunque sia curioso come questa è un'abitudine che sto cercando di essere meglio di: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ util/ArrayList.java # ArrayList.listIterator% 28% 29 – anon58192932

4

Se l'ordine non importa, possiamo ribadire all'indietro con la stessa iteratore utilizzando i hasPrevious() e previous() metodi:

ListIterator<T> lit = myList.listIterator(); // create just one iterator 

Inizialmente l'iteratore trova all'inizio, facciamo avanti iterazione:

while (lit.hasNext()) process(lit.next()); // begin -> end 

Poi l'iteratore siede alla fine, si può fare all'indietro iterazione:

while (lit.hasPrevious()) process2(lit.previous()); // end -> begin 
4

Questo una soluzione alternativa, ma si potrebbe sostenere che non aggiunge valore sufficiente a rendere ne vale la pena:

import com.google.common.collect.Iterables; 
... 
Iterator<String> iter = Iterables.cycle(list).iterator(); 
if(iter.hasNext()) { 
    str = iter.next(); 
} 

Calling hasNext() sarà resettare il cursore iteratore all'inizio se è un fine.

Problemi correlati