Newsgroup: it.comp.java
Titolo: Come si sceglie se usare un ciclo for o while?

Questa volta non vi chiederò codicillo da quattro soldi :-)
Mi stavo chiedendo voi in base a quale criterio scegliete se usare un 
ciclo for, un ciclo while o addirittura do/while?
Non riesco ancora ad apprezzarne bene le differenze.
So che for dà il vantaggio di una gestione unitaria e semplificata della 
variabile di controllo dell'iterazione...ma c'e' altro che val la pena 
considerare?
 
Grazie.
J


for : quando il numero di iterazioni è noto e non c'è necessità di dover 
interrompere il ciclo;
 
do: quando devi fare *almeno una* iterazione e non sai a priori quante 
ne farai;
 
while: quando potresti avere zero iterazioni e non sai a priori quante 
ne farai;
 
In ogni caso i tre costrutti sono sempre intercambiabili, previa 
opportuna contorsione del codice!
 

 Non riesco ancora ad apprezzarne bene le differenze.
 
In linea di massima dipende se vuoi fare il controllo prima o dopo il 
ciclo, o se sai in anticipo quante volte vuoi fare il ciclo.
 
Troppi problemi comunque, se per te non c'è differenza sai già come 
procedere: usane uno qualsiasi.
Eventualmente dovessi capire in un secondo momento che un altra 
struttura andava meglio, allora la cambierai.

 opportuna contorsione del codice!
 
contorsione?
 
ciao e grazie
 
 

il 14.02.2012 11:16, Scrive Jamie 121626976:

Grosso modo, chi decide e' la preferenza del programmatore, nel senso 
che i tre metodi possono funzionare allo stesso modo, dipendentemente da 
come li condizioni. Ad esempio i tre costrutti che seguono si comportano 
allo stesso modo:
for(;;) {}
while(true) {}
do {} while(true);
Mentre il l'iterazione for puo' sostituire sia il do che il while, la 
differenza tra do e while e' che nel do la condizione di controllo viene 
valutata alla fine di ogni ciclo, mentre nel while all'inizio.
 
S'intende che tutte tre le iterazioni possono essere controllate con 
break; e continue;.
Per iterazioni semplici, dove ad esempio una variabile di controllo non 
e' strettamente necessaria, io preferisco il while. Ad esempio:
List<String> lista;
Iterator<String> iterator = lista !=null?lista.iterator():null;
 
for(;iterator !=null && iterator.hasNext();) {
	String elemento = iterator.next();
}
 
analogamente col while;
 
while(iterator !=null && iterator.hasNext()) {
	String elemento = iterator.next();
}
 
 
Ovviamente una visione ampia del linguaggio e delle classi che usi ti 
aiuta in queste decisioni.
 
Ti segnalo anche l'iterazione for-each (introdotta nel linguaggio java a 
partire, direi, dalla 1.5), che funziona con gli array e con le classi 
che implementano java.lang.Iterable, ovvero le classi che implementano 
il metodo iava.util.Iterator iteretor();
Appartengono a questo gruppo di classi tutte le Collection. L'uso e' 
molto semplice:
 
 
for(String elemento: lista) {
}
 
che equivale all'iterazione di tutti gli elementi della lista, 
esattamente come negli esempi sopra, ma funziona anche se lista e' un 
String[].

 contorsione?
 
Per passare da un for....
 
for(int i=0; i<getSize(); i++){
	doSomething(getElement(i));
}
 
...ad un while devi solo spostare un po' di cose.
 
int i=0;
while(i<getSize()){
	doSomething(getElement(i));
	i++;
}
 
Le due sono perfettamente equivalenti. Nello specifico perň la seconda č 
un po' meno leggibile: col for sulla stessa riga sapevi come iniziava, 
quando finiva, come ci arrivava. Qui i tre elementi sono un po' 
sparpagliati e se il ciclo fosse bello lungo sarebbe anche peggio.
 
Se poi usi il do..while devi anche tenere in considerazione che la 
condizione viene esaminata *dopo* il ciclo, quindi almeno una volta ci 
entra:
 
int i=0;
do {
	doSomething(getElement(i));
	i++;
} while(i<getSize());
 
ora immagina che getSize restituisca 0 e che getElement lanci sempre 
eccezione in questo caso. Con for e while nessun problema. Con do..while 
dovresti come minimo aggiungere un controllo dentro al ciclo che 
verifica la condizione anomala.
 
Piccola nota personale: giurerei di non aver mai usato un do..while 
negli ultimi 5 anni. Forse di piů...
 
-- 
r--r--r--


l'utilizzo di questi tre costrutti (a cui si potrebbe aggiungere anche
il foreach) dipende in buona parte dallo stile di programmazione, per
cui non starei tanto a scervellarmi per capire se mi sfugge qualcosa.
l'importante è aver capito come funzionano, poi a parte qualche
situazione classica è una questione di stile di programmazione
tecnicamente poco rilevante. io ad esempio uso quasi sempre il while
anche quando magari qualcun altro farebbe in altro modo.
 
 
 

 anche quando magari qualcun altro farebbe in altro modo.
 
Ok grazie. Volevo solo capire se c'era qualche motivo di ordine pratico 
per preferire uno all'altro, insomma volevo sentire la voce 
dell'esperienza...
Un'altra domanda, sempre sui cicli.
Prendendo ad esame questo frammento di codice:
http://img696.imageshack.us/img696/9911/while.jpg
 
 
secondo la slide e' un ciclo che viene eseguito all'infinito perche' la 
variabile contatore del ciclo "esterno" non arriva mai a soddisfare la 
condizione di stop.
Quel che mi chiedo e'...pero' quella del ciclo interno a un certo punto 
si interrompe, allora perche' la stringa "here" viene stampata comunque 
infinite volte?
Il ciclo esterno e' infinito ma quando il ciclo interno arriva alla fine 
non dovrebbe il ciclo esterno smettere comunque di stampare here? Ecco, 
non capisco perche' l'interruzione del ciclo interno non comporta anche 
l'interruzione di quello esterno, perche' di fatto quello esterno e' 
infinito ma continuerebbe a ciclare cosa?


Perché il ciclo interno finisce, dopo 30 iterazioni, ma quello esterno 
no, quindi la variabile count2 viene reinizializzata a 1 e il ciclo 
interno ricomincia...
La stampa "Here" avviene sempre nel ciclo interno, mai in quello esterno.
 
 

 interno ricomincia...
 
ah ecco, mi era sfuggita la riga di re-inizializzazione della variabile 
count2
 
grazie