2009-04-06 51 views
5

En este código, ¿por qué mi matriz no se inicializó como yo quería? ¿El ciclo for-each no está diseñado para eso, o simplemente no lo estoy usando correctamente?¿Por qué no funciona este bucle for-each?

int[] array = new int[5]; 

    //initialise array -> Doesn't work! Array still full of 0's 
    for(int i : array) 
     i = 24; 
+0

¿No debería la otra pregunta ser un duplicado? Esto fue primero. – masher

Respuesta

14

El bucle for-each no funcionará en este caso. No puede usar un bucle for-each para inicializar una matriz. Su código:

int[] array = new int[5]; 
for (int i : array) { 
    i = 24; 
} 

se traducirá en algo como lo siguiente:

int[] array = new int[5]; 
for (int j = 0; j < array.length; j++) { 
    int i = array[j]; 
    i = 24; 
} 

Si esto fuera una matriz de objetos, sería todavía fallan. Básicamente, cada uno asigna cada entrada en la colección o matriz, a su vez, a la variable que proporcione, con la que luego puede trabajar. La variable es no equivalente a una matriz de referencia. Es solo una variable.

Para cada-no puede ser utilizado para inicializar cualquier matriz o colección, porque se realiza un bucle sobre el contenido actual de la matriz o colección, dándole cada valor uno a la vez. La variable en for-each es no un proxy para una matriz o referencia de colección. El compilador no reemplaza su "i" (de "int i") con "array[index]".

Si usted tiene una serie de fecha, por ejemplo, y de probar esto, el código:

Date[] array = new Date[5]; 
for (Date d : array) { 
    d = new Date(); 
} 

se traduciría a algo como esto:

Date[] array = new Date[5]; 
for (int i = 0; i < array.length; i++) { 
    Date d = array[i]; 
    d = new Date(); 
} 

que como se puede ver la voluntad no inicializar la matriz. Usted terminará con una matriz que contiene todos los nulos.

NOTA: Tomé el código anterior, lo compilé en un archivo .class, y luego usé jad para descompilarlo. Este proceso me da el siguiente código, generado por el compilador Sun Java (1.6) en el código anterior:

int array[] = new int[5]; 
int ai[]; 
int k = (ai = array).length; 
for(int j = 0; j < k; j++) 
{ 
    int i = ai[j]; 
    i = 5; 
} 
+0

En realidad, ¿no se traduce en un ciclo while con un iterador? –

+0

No estoy tratando de dar la traducción exacta, sino una idea de por qué no funciona. – Eddie

+0

tiene sentido. Aclamaciones. – masher

3

el int es un tipo primitivo en el sistema, por lo que en realidad estás recibiendo una copia del valor de la celda en la matriz, en lugar de una referencia a esa celda de la matriz que se puede asignar a ....

Déjame intentar explicar esto. Si tuviera una matriz de X, donde X es una clase que tiene miembros de datos, obtendría una referencia a una celda diferente en cada iteración, y podría cambiar su estado invocando funciones en ella (p. Ej., SetValue) .

Cuando tiene una historia diferente, su int no es una referencia, es un valor real en la pila ya que es un tipo primitivo, por lo que en cada iteración, el para copia un valor de la matriz en el i . A continuación, actualiza su i, pero eso no tiene ningún efecto en la matriz.

+0

Sin embargo, esta no es exactamente la razón de la falla. No tiene nada que ver con ser primitivo. No puede usar for-each para inicializar * any * array, sin importar si sus contenidos son primitivos o no. – Eddie

+0

A menos que tu clase tuviera un setValue explícito() al que quisieras llamar. – Uri

+0

Si usa una matriz de Objetos, este código no inicializará la matriz. No tiene nada que ver con que la variable sea primitiva. – Eddie

5

i es solo una copia del int en ese punto de la matriz, no una referencia a la misma. El ciclo for-each no funciona en este caso.

0

debe hacerse lo siguiente:

int[] array = new int[5]; 

// initialise array -> Will work now 
for(int i = 0 ; i< array.length ; i++) 
    array[i] = 24 ; 
+0

No quería escribir todo eso cada vez. Parece que no puedo salirse con la tuya ... :( – masher

+0

Bienvenido al aspecto de tipeo repetitivo de la vida del programador – euphoria83

4

Uso

java.util.Arrays.fill(array, 24)

si va a ser la inicialización de la misma valor. Aparte de eso, Eddie es bastante acertado en su traducción de la construcción de cada uno.

+0

¡Bien! Voy a estar usando esa clase mucho a partir de ahora! – masher

Cuestiones relacionadas