Dlaczego polecenie foreach nie zmienia wartości elementu?

Dlaczego następujące odciski boss a nie bass?

String boss = "boss";
char[] array = boss.toCharArray();

for(char c : array)
{
 if (c== 'o')
     c = 'a'; 
}
System.out.println(new String(array)); //How come this does NOT print out bass?It prints boss.
Author: Makoto, 2013-04-05

6 answers

Zmieniasz zmienną iteracyjną c. To nie zmienia zawartości tablicy. Zmienna iteracji jest tylko kopią elementu tablicy. Jeśli chcesz zmodyfikować tablicę, musisz to zrobić jawnie:

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}

Twój oryginalny kod jest równoważny (zgodnie z sekcja 14.14.2 JLS ) do:

for (int i = 0; i < array.length; i++) {
    char c = array[i];
    if (c == 'o') {
        c = 'a'; 
    }
}

Zmiana wartości zmiennej lokalnej nigdy nie zmieni niczego innego - to po prostu zmienia zmienną lokalną. Na przypisanie:

char c = array[i];

kopiuje wartość w tablicy do zmiennej lokalnej. Nie kojarzy zmiennej lokalnej z elementem tablicy.

 73
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 22:11:09

Dzieje się tak dlatego, że c = 'a' przypisuje a do zmiennej lokalnej c, która nie odwołuje się do rzeczywistej wartości obecnej w tym indeksie samej array. Zawiera tylko kopię wartości obecnej w podanym indeksie array. Tak więc zmiana jest faktycznie dokonywana w zmiennej lokalnej, a nie w rzeczywistej lokalizacji, do której odnosi się array[i].. Jeśli chcesz zmienić wartość, powinieneś użyć następującej opcji:

int i = 0;
for(char c : array)
{
 if (c== 'o')
     array[i] = 'a'; 
  i++;
}
 8
Author: Vishal K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 22:19:17

Zmienna c zostanie zmieniona, ale nie zawartość tablicy. Aby zmienić tablicę, nie używaj c, bezpośrednio manipuluj tablicą.

for(int i = 0; i < array.length; i++)
{
 char c = array[i];
 if (c== 'o')
     array[i] = 'a';
}
 3
Author: rgettman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 22:11:03

Wartość C jest kopią wartości w tablicy. Dostęp do tablicy bezpośrednio, aby zmienić daną wartość.

 3
Author: dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 22:12:19

Przypisujesz' a ' do zmiennej lokalnej c, ale nie do elementu tablicy. Aby drukować basy, potrzebujesz

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}
 3
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 22:12:48

Zmiany zastosowane w pętli' for each ' są dokonywane tylko wewnątrz jej ciała (dzieje się tak dlatego, że wartości są kopiowane, a nie referencjowane). Aby pracować nad referencjami użyj pętli 'for'.

 1
Author: Michał Tabor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 22:12:22