2013-08-11 3 views
4

я могу читать данные из массива с для каждого синтаксиса:Для каждого цикла: можно ли заполнить массив?

int[] a = new int[100]; 
for (int i = 0; i < 100; i++){ 
    a[i] = i; 
} 


for (int element : a){ 
    System.out.println(element);       
} 

Но можно заполнить массив таким же образом. Скажем, с i*2 значениями?
Мне не удалось придумать такой метод и скорее спросит вас, ошибаюсь я или нет.

+0

Вы не можете получить доступ к индексам, используя * для каждого * цикла. Вместо этого используйте первый. – Maroun

ответ

7

От Java Docs,

для-каждого цикла скрывает итератора, так что вы не можете позвонить удалить. Следовательно, цикл for для каждого цикла не используется для фильтрации. Аналогично он не может использоваться для циклов, где вам нужно заменить элементы в списке или массиве при его перемещении. Наконец, он не может использоваться для циклов , которые должны последовательно перебирать несколько коллекций. Эти недостатки были известны дизайнерам, которые приняли сознательное решение , чтобы пойти с чистой, простой конструкцией, которая бы охватывала подавляющее большинство случаев.

Итак, простыми словами, его невозможно заполнить массивами.

+1

Цитата: ответ из документов, вероятно, лучший ответ. – Maroun

+0

@MarounMaroun Не знаете, как Джон Скит пропустил это ... :) :) Просто шучу ... –

2

Нет, это невозможно. Вы должны будете использовать свою первую версию for.

3

Непонятно, чего вы пытаетесь достичь. Улучшенный цикл цикла может только перебирать коллекцию - в вашем случае вы не используете полезные значения в коллекции, начиная с - только коллекцию, которую вы пытаетесь заполнить.

Если вы просто пытаетесь заполнить один массив на основе некоторых вычислений, который не является на основе существующей коллекции, расширенный цикл цикла не поможет.

Даже если вы хотите заполнить массив на основе другой коллекции, использование расширенного цикла не является идеальным, поскольку у вас нет понятия индекса. Например, если у вас есть String массив, и вы хотите, чтобы заполнить в int массив длин строк, вы можете сделать:

String[] words = ...; // Populate the array 
int[] lengths = new int[words.length]; 

int index = 0; 
for (String word : words) { 
    lengths[index++] = word.length(); 
} 

... но он не идеален. Это лучше, если вы заселять List, конечно, как и тогда вы можете просто позвонить add:

String[] words = ...; // Populate the array 
List<Integer> lengths = new ArrayList<Integer>(words.length); 

for (String word : words) { 
    lengths.add(word.length()); 
} 
1

Там нет счетчика для текущего индекса, только значения по индексу InThe цикла Еогеасп, следовательно, не представляется возможным ,

1

Невозможно присвоить значения фактическому массиву, который вы используете, в расширенном для каждого цикла. Это связано с тем, что расширенный цикл for-each не дает вам доступа к указателям массива.Для того, чтобы изменить значения массива, вы должны буквально сказать:

a[i] = anything 

Вы можете, однако, использовать усиленный для петли, чтобы назначить значения другого массива, как так:

int[] nums = new int[4]; 
int[] setNums = {0,1,2,3}; 
i = 0; 
for(int e: setNums) { 
    nums[i++] = e*2; 
} 

Enhanced для -loops в Java просто предлагают немного синтаксического сахара, чтобы получить значения массива или списка. В некотором смысле они работают аналогично передаче объектов методу - исходный объект, переданный методу, не может быть повторно назначен в методе. Например:

int i = 1; 
void multiplyAndPrint(int p) { 
    p = p*2; 
    System.out.println(p); 
} 
System.out.println(i); 

Напечатает 2, а затем 1. Это тот же вопрос, вы будете работать в попытке присвоить значения из-за каждый цикл.

Смежные вопросы