Si vous regardez ce qui se passe à arr
dans la première boucle, il devient évident.
int[] arr = {1, 2, 3, 4};
for (int i : arr) {
System.out.println("i = " + i);
arr[i] = 0;
System.out.println("arr = " + Arrays.toString(arr));
}
for (int i : arr) {
System.out.println(i);
}
Cette impression:
i = 1
arr = [1, 0, 3, 4]
i = 0
arr = [0, 0, 3, 4]
i = 3
arr = [0, 0, 3, 0]
i = 0
arr = [0, 0, 3, 0]
0
0
3
0
Vous modifiez les valeurs dans le tableau, en utilisant les valeurs dans le tableau comme index. La boucle "foreach" passe par les valeurs du tableau, pas les index du tableau. Après avoir enlevé le sucre syntaxique, voici ce que votre boucle foreach est en fait:
int[] arr = {1, 2, 3, 4};
for (int index = 0; index < arr.length; index++) {
int i = arr[index];
arr[i] = 0;
}
for (int i : arr) {
System.out.println(i);
}
Pour être en mesure d'indexer le tableau, vous devez utiliser la traditionnelle boucle, comme ceci:
int[] arr = {1, 2, 3, 4};
for (int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
for (int i : arr) {
System.out.println(i);
}
Oui c'est le cas, vous ne voyez pas le problème sous-jacent ici (outre le fait que vous modifiez vos valeurs d'index pendant que vous les utilisez). Les valeurs d'index * dans * le tableau commencent par 1, mais un index de tableau est * basé sur zéro *, signifiant que la première valeur qui est modifiée est en fait la * deuxième * dans le tableau. Donc, la deuxième fois dans la boucle, votre index est maintenant nul (le premier élément du tableau). – BCunningham
Parce que 2 disparaît du tableau avant de pouvoir modifier cet emplacement. – jasonh