Domanda

Vedo spesso codice come:

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

ma lo scrivo (quando Java 1.5 non è disponibile o per ciascuno non può essere utilizzato) come:

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

Perché

  • È più breve
  • Mantiene i in un ambito più piccolo
  • Riduce la possibilità di confusione.(È i usato al di fuori del tempo?Dov'è i dichiarato?)

Penso che il codice dovrebbe essere il più semplice possibile da comprendere, in modo che io debba solo creare codice complesso per fare cose complesse.Cosa ne pensi?Che è migliore?

Da: http://jamesjava.blogspot.com/2006/04/iterating.html

È stato utile?

Soluzione

Preferisco il ciclo for perché imposta anche l'ambito dell'iteratore solo sul ciclo for.

Altri suggerimenti

Esistono usi appropriati per i costrutti while, for e foreach:

  • while - Usalo se stai ripetendo e il fattore decisivo per il looping o meno si basa semplicemente su una condizione.In questo costrutto di ciclo, mantenere un indice è solo una preoccupazione secondaria;tutto dovrebbe essere basato sulla condizione

  • for - Usalo se stai eseguendo un loop e la tua preoccupazione principale è l'indice dell'array/raccolta/elenco.È più utile utilizzare un for se è più probabile che tu vada fino in fondo Tutto comunque gli elementi e in un ordine particolare (ad esempio, andando all'indietro in un elenco ordinato, ad esempio).

  • foreach - Utilizzalo se hai semplicemente bisogno di esaminare la tua collezione indipendentemente dall'ordine.

Ovviamente ci sono delle eccezioni a quanto sopra, ma questa è la regola generale che utilizzo quando decido di utilizzarlo.Detto questo tendo ad usarlo foreach più spesso.

Perché non utilizzare il costrutto for-each?(Non uso Java da un po', ma esiste in C# e sono abbastanza sicuro che anche Java 1.5 abbia questo):

List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));

Penso che la portata sia il problema più grande qui, come hai sottolineato.

Nell'esempio "mentre", l'iteratore viene dichiarato all'esterno del ciclo, quindi continuerà ad esistere al termine del ciclo.Ciò potrebbe causare problemi se lo stesso iteratore viene utilizzato nuovamente in un secondo momento.E.G.potresti dimenticare di inizializzarlo prima di usarlo in un altro ciclo.

Nell'esempio "for", l'iteratore è dichiarato all'interno del ciclo, quindi il suo ambito è limitato al ciclo.Se provi a usarlo dopo il ciclo, otterrai un errore del compilatore.

se utilizzerai l'iteratore solo una volta e lo butterai via, è preferibile la seconda forma;in caso contrario è necessario utilizzare il primo modulo

IMHO, il per loop è meno leggibile in questo scenario, se si guarda questo codice dal punto di vista della lingua inglese.Sto lavorando a un codice in cui l'autore abusa per loop, e non è carino.Confronta quanto segue:

for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;

contro

while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}

Sarei d'accordo sul fatto che il ciclo "for" è più chiaro e più appropriato durante l'iterazione.

Il ciclo "mentre" è appropriato per il polling o quando il numero di cicli per soddisfare la condizione di uscita cambierà in base all'attività all'interno del ciclo.

Non che probabilmente sia importante in questo caso, ma compilatori, VM e CPU normalmente hanno tecniche di ottimizzazione speciali che utilizzano sotto il cofano che miglioreranno le prestazioni dei loop (e nel prossimo futuro in parallelo), in generale non lo fanno con while (perché è più difficile determinare come funzionerà effettivamente).Ma nella maggior parte dei casi la chiarezza del codice dovrebbe prevalere sull’ottimizzazione.

Usando il ciclo for puoi lavorare con una singola variabile, poiché imposta l'ambito della variabile per un ciclo for corrente che funziona solo.Tuttavia questo non è possibile nel ciclo while.Per esempio:
int io;per(i=0;in1;i++) fai qualcosa..

for(i=0;i n2;i+=2) fai qualcosa.

Quindi dopo il primo ciclo i=n1-1 alla fine.Ma mentre usi il secondo ciclo puoi impostare nuovamente i su 0. Tuttavia

int i=0;

while(i inferiore al limite) { fai qualcosa ..;io++;}

Quindi i è impostato su limit-1 alla fine.Quindi non puoi usare lo stesso i in un altro ciclo while.

In entrambi i casi va bene.Io stesso uso for () e non so se ci sono problemi di compilazione.Sospetto che entrambi vengano ottimizzati più o meno per la stessa cosa.

Sono d'accordo che il ciclo for dovrebbe essere utilizzato quando possibile, ma a volte c'è una logica più complessa che controlla l'iteratore nel corpo del ciclo.In tal caso devi procedere con il tempo.

Ero il ciclo for per chiarezza.Mentre utilizzo il ciclo while quando si trova di fronte a qualche condizione non deterministica.

Entrambi vanno bene, ma ricorda che a volte l'accesso diretto all'Iterator è utile (ad esempio se stai rimuovendo elementi che corrispondono a una determinata condizione: otterrai una ConcurrentModificationException se esegui collection.remove(o) all'interno di un for(T o :raccolta) ciclo).

Preferisco scrivere il for(blah:blah) [foreach] sintassi quasi sempre perché mi sembra più leggibile in modo naturale.Il concetto di iteratori in generale non ha paralleli al di fuori della programmazione

Il mondo accademico tende a preferire il ciclo while poiché rende meno complicato il ragionamento sui programmi.Tendo a preferire le strutture del ciclo for o foreach poiché rendono il codice più facile da leggere.

Sebbene entrambi siano davvero validi, tendo a utilizzare il primo esempio perché è più facile da leggere.

Ci sono meno operazioni che si verificano su ogni riga con il ciclo while(), rendendo il codice più semplice per chi è nuovo al codice per capire cosa sta succedendo.

Questo tipo di costrutto mi consente anche di raggruppare le inizializzazioni in una posizione comune (nella parte superiore del metodo), il che semplifica anche i commenti per me e la concettualizzazione per qualcuno che lo legge per la prima volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top