Pregunta

A menudo veo código como:

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

pero escribo eso (cuando Java 1.5 no está disponible o no se puede usar para cada uno) como:

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

porque

  • es mas corto
  • Mantiene i en un alcance más pequeño
  • Reduce la posibilidad de confusión.(Es i usado fuera del tiempo?Dónde es i ¿declarado?)

Creo que el código debería ser lo más sencillo de entender posible para que sólo tenga que crear código complejo para hacer cosas complejas.¿Qué opinas?¿Cual es mejor?

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

¿Fue útil?

Solución

Prefiero el bucle for porque también establece el alcance del iterador solo para el bucle for.

Otros consejos

Hay usos apropiados para las construcciones while, for y foreach:

  • while - Utilice esto si está iterando y el factor decisivo para realizar un bucle o no se basa simplemente en una condición.En esta construcción de bucle, mantener un índice es sólo una preocupación secundaria;todo debe basarse en la condición

  • for - Utilice esto si está haciendo un bucle y su principal preocupación es el índice de la matriz/colección/lista.Es más útil utilizar un for si es más probable que pase por todo los elementos de todos modos, y en un orden particular (por ejemplo, retrocediendo a través de una lista ordenada, por ejemplo).

  • foreach - Utilízalo si simplemente necesitas revisar tu colección independientemente del orden.

Obviamente hay excepciones a lo anterior, pero esa es la regla general que uso cuando decido usar cuál.Dicho esto, suelo utilizar foreach más a menudo.

¿Por qué no utilizar la construcción para cada uno?(No he usado Java por un tiempo, pero esto existe en C# y estoy bastante seguro de que Java 1.5 también lo tiene):

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));

Creo que el alcance es el mayor problema aquí, como usted ha señalado.

En el ejemplo " while ", el iterador se declara fuera del bucle, por lo que seguirá existiendo una vez finalizado el bucle.Esto puede causar problemas si este mismo iterador se vuelve a utilizar en algún momento posterior.MI.gramo.es posible que olvide inicializarlo antes de usarlo en otro bucle.

En el ejemplo "for", el iterador se declara dentro del bucle, por lo que su alcance se limita al bucle.Si intenta usarlo después del ciclo, obtendrá un error del compilador.

si sólo va a utilizar el iterador una vez y lo desechará, se prefiere la segunda forma;de lo contrario debes usar el primer formulario

En mi humilde opinión, el para El bucle es menos legible en este escenario, si observa este código desde la perspectiva del idioma inglés.Estoy trabajando en un código donde el autor abusa. para bucle, y no es bonito.Compara lo siguiente:

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

vs

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

Estoy de acuerdo en que el bucle "for" es más claro y apropiado al iterar.

El bucle " while " es apropiado para el sondeo, o donde la cantidad de bucles para cumplir con la condición de salida cambiará según la actividad dentro del bucle.

No es que probablemente importe en este caso, pero los compiladores, las máquinas virtuales y las CPU normalmente utilizan técnicas de optimización especiales que mejorarán el rendimiento de los bucles (y en un futuro próximo paralelo), en general no hacen eso con bucles while (porque es más difícil determinar cómo se ejecutará realmente).Pero en la mayoría de los casos la claridad del código debería prevalecer sobre la optimización.

Al usar el bucle for, puede trabajar con una sola variable, ya que establece el alcance de la variable para un bucle for actual que funciona únicamente.Sin embargo, esto no es posible en el bucle while..Por ejemplo:
ent yo;para(i=0;in1;i++) haz algo..

for(i=0;i n2;i+=2) haz algo.

Entonces, después del primer ciclo, i=n1-1 al final.Pero mientras usa el segundo bucle, puede configurar i nuevamente en 0. Sin embargo

int i=0;

mientras (yo menos que el límite) { hacer algo ..;yo ++;}

Por lo tanto, i se establece en límite-1 al final.Entonces no puedes usar la misma i en otro bucle while.

Cualquiera esta bien.Yo mismo uso for () y no sé si hay problemas de compilación.Sospecho que ambos se optimizan para prácticamente lo mismo.

Estoy de acuerdo en que el bucle for debe usarse siempre que sea posible, pero a veces hay una lógica más compleja que controla el iterador en el cuerpo del bucle.En ese caso hay que ir con while.

Yo era el bucle for para mayor claridad.Mientras uso el mientras bucle cuando nos enfrentamos a alguna condición indeterminista.

Ambos están bien, pero recuerde que a veces el acceso directo al Iterador es útil (por ejemplo, si elimina elementos que coinciden con una determinada condición, obtendrá una excepción ConcurrentModificationException si realiza collection.remove(o) dentro de un for(T o :colección) bucle).

Prefiero escribir el for(bla:bla) sintaxis [foreach] casi todo el tiempo porque me parece más legible de forma natural.El concepto de iteradores en general no tiene paralelos fuera de la programación.

El mundo académico tiende a preferir el ciclo while porque permite un razonamiento menos complicado sobre los programas.Tiendo a preferir las estructuras de bucle for o foreach, ya que facilitan la lectura del código.

Aunque ambos están muy bien, tiendo a usar el primer ejemplo porque es más fácil de leer.

Hay menos operaciones en cada línea con el bucle while(), lo que hace que el código sea más fácil para alguien nuevo en el código entender lo que está sucediendo.

Ese tipo de construcción también me permite agrupar inicializaciones en una ubicación común (en la parte superior del método), lo que también me simplifica los comentarios y la conceptualización para alguien que lo lee por primera vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top