2011-05-18 32 views
6

Tengo un bucle bastante simple:Java: ¿El bucle Foreach no funciona como se esperaba en la matriz int?

int[] positions = {1, 0, 0} 

//print content of positions 

for (int i : positions) 
{ 
    if (i <= 0) i = -1; 
} 

//print content of positions 

Ahora, lo que se espera conseguir es:

array: 1, 0, 0 
array: 1, -1, -1 

pero en cambio me sale

array: 1, 0, 0 
array: 1, 0, 0 

Sólo ... ¿por qué?

Saludos cordiales, medusas

Respuesta

19

Porque "i" es una copia de un elemento de matriz y no una referencia a él :) modifica una variable local, no elemento de una matriz

este código es equivalente a

for(int index = 0; index < array.length; index++) { 

int i = array[index]; 
... 
} 
+0

me tomó mucho tiempo para encontrar esta respuesta ... tengo una matriz y crear instancias de objetos en el interior estaba foreach, y acceder a ellos más tarde con el índice, y yo obtuve la excepción del puntero nulo. entonces para y para el foreach NO son lo mismo ... – Aleksandrus

2

Es simple. Si se escribe

int i = positions[0]; 

Entonces se copia positions[0] por valor, no por referencia. No puede modificar el valor original en positions[0] desde i. Lo mismo se aplica a la asignación de i dentro de un bucle foreach.

La solución es, sin un bucle foreach

for (int i = 0; i < positions.length; i++) 
{ 
    if (positions[i] <= 0) positions[i] = -1; 
} 
2

Esto sucede detrás de las escenas si usamos el ciclo mejorado con matrices:

int[] array = {1,2,3,4,5}; 
for($i = 0; $i<array.length; $i++) { 
    int i = array[$i]; 
    // your statements 
    if (i <= 0) i = -1; 
} 

$i es sólo un marcador de posición para un bucle interno no identificado variable. Vea lo que ocurre: asigne un nuevo valor al i, pero i se carga con el siguiente elemento del conjunto en la siguiente iteración.

Por lo tanto, prácticamente hablado, no podemos usar la variable declarada en el bucle for mejorado para modificar la matriz subyacente.

Referencia: JLS 3.0, 14.14.2

Cuestiones relacionadas