2012-06-14 78 views
5

Estoy aprendiendo Java por mi cuenta; y, por lo tanto, el siguiente código no tiene otra función que no sea para aprender/probar.Elementos modificadores de Java en un foreach

Básicamente, estoy tratando de modificar los elementos de una matriz de enteros (es decir, reduciéndolos a la mitad) mientras estoy en un bucle foreach.

Debo notar que no estoy reordenando, agregando o eliminando elementos; simplemente cambiando sus valores.

Aquí está mi código:

Logger.describe("Now copying half of that array in to a new array, and halving each element"); 
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];  
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2); 
for (Integer x : copyArray) x /= 2; 
Logger.output(Arrays.deepToString(copyArray)); 

Sin embargo, la matriz original (intArray) es la siguiente:

[47, 31, 71, 76, 78, 94, 66, 47, 73, 21] 

Y la salida de copyArray es:

[47, 31, 71, 76, 78] 

Así que, aunque la matriz se ha reducido a la mitad en tamaño, los elementos (enteros) no se han reducido a la mitad en valor. Entonces, ¿qué estoy haciendo mal?

Gracias

+1

Creo que esto tiene que ver con autoboxing, así que cuando lo hace 'x/2', no se modifica el valor del objeto, pero de forma automática lo convierte en un 'int' primitivo y lo divide, por lo tanto, su instancia' Integer' no se ve afectada. – maksimov

+0

Entonces, ¿el operador/= solo se aplica a los tipos de valores 'int', y no a los enteros, lo que hace que la variable 'x' se convierta en un int? – Xenoprimate

+0

Esencialmente 'x = x/2' es un' x = nuevo entero (x.intValue()/2) '. Entonces, como no lo está agregando de nuevo a la matriz, no está modificando los elementos de la matriz. – maksimov

Respuesta

13

No puede hacer eso en un bucle foreach.

for (int i=0; i<copyArray.length;i++) 
    copyArray[i] /= 2; 

Si no lo está asignando de nuevo en la matriz. Integer los objetos son inmutables por cierto, por lo que no pueden modificarlos (creando otros nuevos).

actualizada de comentario: Sin embargo, Aviso de que hay algunas cosas que suceden, autoboxing/unboxing por ejemplo, más o menos:

copyArray[i] = Integer.valueOf(copyArray[i].intValue()/2); 
+0

Considerando su inmutabilidad, ¿eso solo significa que reemplazará el objeto Integer por uno nuevo en la matriz? – Xenoprimate

+0

Correcto. En este caso, también está activo el autoboxing/unboxing. Simultáneamente también: 'copyArray [i] = Integer.valueOf (copyArray [i] .intValue()/2);' –

+0

Entonces, ¿Integer es solo un contenedor de objetos para int? ¿No es un alias real (como en C#)? – Xenoprimate

1
for (int i = 0; i< copyArray.length; i++) { 
    copyArray[i] = new Integer(x /2); 
} 

debe trabajar.

1
int counter = 0; 
for(int x : copyArray) 
{ 
     x /= 2; 
     copyArray[counter++] = x; 
} 

Su programa acaba de modificar el valor de la variable x, no el valores dentro de los bloques de la matriz copyArray

0

Creo que NO puede usar la construcción de bucle foreach para modificar los elementos de la matriz que está iterando. En su lugar, es necesario utilizar un clásico de bucle así:

Logger.describe("Now copying half of that array in to a new array, and halving each element"); 
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];  
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2); 
    for (int i = 0; i < copyArray.length; i++) { 
     copyArray[i] /= 2; 
    } 
Logger.output(Arrays.deepToString(copyArray)); 
+1

En general, PUEDE modificar los elementos (si son mutables), el problema real es que los enteros son inmutables ... – Mainguy

Cuestiones relacionadas