Inizializzazione di un array in Java usando “advanced” per ogni loop

È ansible inizializzare un array in Java usando il ciclo ‘advanced’ per loop?

per esempio

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

Questo stampa tutti i null, perché è quello?

No, perché non stai assegnando all’array, stai assegnando alla variabile temporanea chiamata i . L’array non vede il cambiamento.

Quanto segue mostra un codice approssimativamente equivalente usando il ciclo normale for . Questo dovrebbe rendere più facile capire perché non riesce ad aggiornare l’array:

 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. } 

Il motivo per cui si ottengono valori nulli come output è che non si memorizzano valori nell’array.

È ansible utilizzare il ciclo foreach per inizializzare l’array, ma è necessario mantenere manualmente un contatore per fare riferimento agli elementi dell’array:

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

Chiaramente, questo non è il caso d’uso previsto per il ciclo foreach. Per risolvere il tuo problema, ti suggerirei di utilizzare il ciclo “tradizionale” per:

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

Nota, è ansible riempire tutti gli elementi con lo stesso valore usando Arrays.fill (int [] array, int val) .

Fondamentalmente no, non come desideri. Nel ciclo “avanzato” per il ciclo, non vi è alcun modo per accedere al contatore nascosto e nessuno dei due è in grado di eseguire un accesso in scrittura sullo slot di matrice corrispondente.

Il ciclo for ‘advanced’ non espone il contatore a te, e quindi, non puoi scrivere il risultato di counter++ nello slot dell’array specifico.

Il tuo caso è il caso in cui non è stato creato il ciclo avanzato per il ciclo. Vedere:

http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html

Dai un’occhiata all’ultimo paragrafo.

Nel tuo caso, non puoi. Per ogni: nasconde l’iteratore nella raccolta sottostante, quindi qui non è ansible capire quale posizione nei “numeri” si sono attualmente quando si tenta di “inizializzare” la matrice. Questo è un caso d’uso per il quale il ciclo “avanzato” non è fatto.