Подтвердить что ты не робот

Инициализация массива в 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, почему?

4b9b3361

Ответ 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

В вашем случае вы не можете. Для каждого скрывает итератор в базовой коллекции, поэтому здесь вы не можете понять, какую позицию в "числах" вы используете, когда пытаетесь "инициализировать" массив. Это один прецедент, для которого не создан "продвинутый" цикл.