Инициализация массива в Java с использованием "расширенного" для каждого цикла
Можно ли инициализировать массив в Java, используя цикл 'advanced' for?
например.
Integer[ ] numbers = new Integer[20];
int counter = 0;
for ( Integer i : numbers )
{
i = counter++;
}
for ( Integer i : numbers )
{
System.out.println(i);
}
Это печатает все значения NULL, почему?
Ответы
Ответ 1
Нет, потому что вы не назначаете массив, вы назначаете временную переменную с именем i
. Массив не видит изменения.
Ниже показан примерно эквивалентный код, используя обычный цикл for
. Это должно облегчить понимание того, почему он не обновляет массив:
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
Причина, по которой вы получаете нулевые значения в качестве вывода, состоит в том, что вы не храните никаких значений в массиве.
Вы можете использовать цикл foreach для инициализации массива, но тогда вы должны вручную поддерживать счетчик для ссылки на элементы массива:
for (Integer i : numbers ){
numbers[counter] = counter;
counter++;
}
Ясно, что это не предполагаемый прецедент для цикла foreach. Чтобы решить вашу проблему, я бы предложил использовать "традиционный" цикл:
for (int i = 0; i < numbers.length; i++){
numbers[i] = i;
}
Обратите внимание, что все элементы могут быть одинаковыми с помощью Arrays.fill(int [] array, int val).
Ответ 3
В принципе нет, не так, как вы пожелаете. В цикле "advanced" for нет доступа к скрытому счетчику, и ни один из них не должен выполнять доступ к записи в соответствующем слоте массива.
Ответ 4
"advanced" for-loop не предоставляет вам счетчик, и, следовательно, вы не можете записать результат counter++
в определенный слот массива.
Ваш случай - это случай, когда "продвинутый" цикл for не создан. См:
http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Взгляните на последний параграф.
Ответ 5
В вашем случае вы не можете. Для каждого скрывает итератор в базовой коллекции, поэтому здесь вы не можете понять, какую позицию в "числах" вы используете, когда пытаетесь "инициализировать" массив. Это один прецедент, для которого не создан "продвинутый" цикл.