loop for java for-loop iterator

for loop java



Itera con for loop o while loop? (15)

¿Por qué no usar el constructo for-each? (No he usado Java desde hace 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));

A menudo veo código como:

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

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

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

porque

  • Es más corto
  • Lo mantengo en un ámbito más pequeño
  • Reduce la posibilidad de confusión. (¿Se usa fuera de tiempo? ¿Dónde i declaro?)

Creo que el código debe ser tan simple de entender como sea posible para que solo tenga que hacer código complejo para hacer cosas complejas. ¿Qué piensas? ¿Cual es mejor?

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


Ambos están bien, pero recuerde que a veces el acceso al iterador directamente es útil (por ejemplo, si está eliminando elementos que coinciden con una determinada condición, obtendrá una excepción ConcurrentModificationException si lo hace. Retire (o) dentro de a para (T o: colección) loop).

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


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

Hay menos operaciones en cada línea con el ciclo while (), lo que hace que el código sea más fácil para que alguien nuevo en el código comprenda 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) que también simplifica los comentarios para mí, y la conceptualización para alguien que lo lee por primera vez.


Creo que el alcance es el problema más importante aquí, como ha señalado.

En el ejemplo "while", el iterador se declara fuera del bucle, por lo que continuará existiendo después de finalizar el bucle. Esto puede causar problemas si este mismo iterador se usa nuevamente en algún momento posterior. P.ej. puede olvidarse de inicializarlo antes de usarlo en otro ciclo.

En el ejemplo "para", el iterador se declara dentro del bucle, por lo que su alcance está limitado al bucle. Si intenta usarlo después del bucle, obtendrá un error de compilación.


Cualquiera esta bien. Yo uso para () yo mismo, y no sé si hay problemas de compilación. Sospecho que ambos se optimizan hasta casi lo mismo.


En mi humilde opinión, el bucle for es menos legible en este escenario, si miras este código desde la perspectiva del idioma inglés. Estoy trabajando en un código donde el autor utiliza el bucle de abuso, y no es bonito. Comparar a continuación:

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 ciclo "para" es más claro y más apropiado al iterar.

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


Estoy de acuerdo en que el ciclo 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 ciclo. En ese caso, tienes que ir contigo.


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

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

  • for - Use esto si está bucleando y su principal preocupación es el índice de la matriz / colección / lista. Es más útil utilizar un para si es más probable que vaya a través de todos los elementos de todos modos, y en un orden particular (por ejemplo, ir hacia atrás a través de una lista ordenada, por ejemplo).

  • foreach : foreach si simplemente necesitas revisar tu colección sin importar el orden.

Obviamente, hay excepciones a lo anterior, pero esa es la regla general que uso cuando decido usarla. Dicho esto, tiendo a usar foreach más frecuencia.


La academia tiende a preferir el ciclo while ya que hace que el razonamiento sea menos complicado sobre los programas. Tiendo a preferir las estructuras de bucle for o foreach, ya que hacen que el código sea más fácil de leer.


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


Prefiero el ciclo for porque también establece el alcance del iterador solo en el ciclo for.


Yo era el bucle for para la claridad. Mientras uso el ciclo while cuando me enfrento a una condición indeterminada.


si solo vas a utilizar el iterador una vez y tirarlo, se prefiere la segunda forma; de lo contrario, debe usar el primer formulario


Al usar for bucle, puede trabajar con una sola variable, ya que establece el alcance de la variable para un bucle de trabajo actual solo. Sin embargo, esto no es posible en el ciclo while . Por ejemplo:
int i; para (i = 0; in1; i ++) hacer algo ...

para (i = 0; i n2; i + = 2) hacer algo.

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

int i = 0;

while (i less than limit) {haz algo ...; i ++; }

Por lo tanto, estoy configurado para limitar-1 al final. Entonces no puedes usar el mismo yo en otro ciclo while.