2012-01-23 6 views
1

У меня есть булево массивJava для каждой итерации петли булева массива

boolean[] test = { 
    false, 
    true, 
    true, 
    false, 
    true 
}; 

и я пытаюсь перевернуть (правда ложь, и ложь истина) значения с «для-каждого» заявление, как так :

for(boolean x : test) { 
    x = !x; 
} 

Но это только изменение x переменной в локальной области.

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

+0

Вы пытались поместить переменную в список? и на самом деле, чего вы на самом деле хотите? – Chintan

ответ

9

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

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

(Обратите внимание, что расширение для цикла позволит вам внести изменения в объектов которых любые элементы массива упомянутых, если бы они были классы - но это не то же самое, что изменение значения самого элемента.)

+0

Нам не разрешено изменять значение, которое мы итерируем, но почему так? Какие могут быть последствия, если нам было бы позволено это делать? –

1

Вы не можете изменить элемент в цикле for-each. Можете ли вы использовать обычный цикл?

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

В расширенном цикле for создается новая переменная x и каждый раз задается значение локально, поскольку boolean является примитивным и поэтому не передается Справка. Для этого вам нужно использовать старый цикл for.

1

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

2

Вам нужно будет использовать не-усовершенствован для цикла, если вы хотите, не влияют на значения теста:

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

Не будет ли элемент 'test [0]' оставаться неизменным из-за предварительного приращения '++ i'? – Teneff

+0

№. Приращение выражения вычисляется ПОСЛЕ каждого выполнения цикла. Итак, для первого выполнения цикла i будет присвоено значение 0. –

1

Никаких сюрпризов, что он не работает. Вы все-таки управляете локальной переменной, а не объектом, а не ссылкой. Используйте обычный цикл и измените соответствующую позицию.