2010-03-31 13 views
18

¿Es posible inicializar una matriz en Java utilizando el bucle 'avanzado'?Inicialización de una matriz en Java utilizando el 'avanzado' para cada bucle

p. Ej.

Integer[ ] numbers = new Integer[20]; 
    int counter = 0; 
    for (Integer i : numbers) 
    { 
     i = counter++; 
    } 

    for (Integer i : numbers) 
    { 
     System.out.println(i); 
    } 

Esto imprime todos los nulos, ¿por qué?

+0

http://stackoverflow.com/questions/1823117/for-each-and-pointers-in-java –

Respuesta

23

No, porque no está asignando a la matriz, está asignando a la variable temporal llamada i. La matriz no ve el cambio.

A continuación, se muestra un código aproximadamente equivalente con el lazo for normal. Esto debería hacer que sea más fácil ver por qué no actualiza la matriz:

for (int j = 0; j < numbers.length; j++) { 
    Integer i = arr[j]; // i is null here. 
    i = counter++; // Assigns to i. Does not assign to the array. 
} 
2

Básicamente no, no como desee. En el bucle 'avanzado', no hay forma de acceder al contador oculto y tampoco existe la posibilidad de realizar un de escritura en la ranura de matriz correspondiente.

0

En su caso, no puede. Porque cada uno oculta el iterador en la colección subyacente, por lo que aquí no se puede determinar en qué posición de "números" se encuentra actualmente cuando intenta "inicializar" la matriz. Este es un caso de uso para el que el bucle "avanzado" no está hecho.

3

La razón por la que obtiene valores nulos como resultado es que no almacena ningún valor en la matriz.

se puede utilizar el bucle foreach para inicializar la matriz, pero entonces hay que mantener manualmente un contador para hacer referencia a los elementos de la matriz:

for (Integer i : numbers){ 
    numbers[counter] = counter; 
    counter++; 
}

Claramente, este no es el caso de utilización prevista para el bucle foreach. Para resolver el problema, se recomienda usar la "tradicional" para el bucle:

for (int i = 0; i < numbers.length; i++){ 
    numbers[i] = i; 
}

Nota, es posible llenar todos los elementos con el mismo valor con Arrays.fill(int[] array, int val).

+0

también utilizan int [] en lugar de Integer [] a menos que sea necesario. – Nishu

Cuestiones relacionadas