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.
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.
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++;
}
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';
}
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ść.
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';
}
}
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'.
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