Comment se fait-il que les imprimés suivants soient boss et non basse?
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.
Vous modifiez la variable d'itération c
. Cela ne change pas le contenu du tableau. La variable d'itération n'est qu'une copie de l'élément de tableau. Si vous souhaitez modifier le tableau, vous devez le faire explicitement:
for (int i = 0; i < array.length; i++) {
if (array[i] == 'o') {
array[i] = 'a';
}
}
Votre code d'origine est équivalent (selon section 14.14.2 du JLS ) à:
for (int i = 0; i < array.length; i++) {
char c = array[i];
if (c == 'o') {
c = 'a';
}
}
Changer la valeur d'une variable locale ne changera jamais rien d'autre - il juste change la variable locale. La tâche:
char c = array[i];
copie la valeur du tableau dans une variable locale. Il n'associe pas perpétuellement la variable locale à l'élément de tableau.
Ceci est dû au fait c = 'a'
assigne a
à la variable locale c
qui ne fait pas référence à la valeur réelle présente à cet index du array
lui-même. Il contient simplement une copie de la valeur présente à l'index spécifié de array
. Ainsi, le changement est réellement effectué dans la variable locale et non à l'emplacement réel où array[i]
fait référence .. Si vous voulez changer la valeur, vous devez en effet utiliser ce qui suit:
int i = 0;
for(char c : array)
{
if (c== 'o')
array[i] = 'a';
i++;
}
Votre variable c
est modifiée, mais pas le contenu du tableau. Pour modifier le tableau, n'utilisez pas c
, manipulez directement le tableau.
for(int i = 0; i < array.length; i++)
{
char c = array[i];
if (c== 'o')
array[i] = 'a';
}
la valeur de c est une copie de la valeur du tableau. Accédez directement au tableau pour modifier la valeur en question.
Vous affectez "a" à la variable locale c, mais pas à l'élément de tableau. Pour le faire imprimer des basses, il vous faudrait
for (int i = 0; i < array.length; i++) {
if (array[i] == 'o') {
array[i] = 'a';
}
}
Les changements appliqués dans la boucle "pour chaque" sont effectués juste à l'intérieur de son corps (c'est parce que les valeurs sont copiées, pas les références). Pour travailler sur les références utilisez la boucle 'for'.