J'ai créé un programme pour une affectation qui me demande d'afficher les éléments d'un tableau à l'aide de boucles for imbriquées améliorées.
J'obtiens l'erreur qu'il ne peut pas convertir du type d'élément Integer [] en int.
myArray a déjà été instancié et initialisé correctement dans un constructeur. Je sais que c'est correct car je peux très bien afficher les éléments du tableau au format liste, de 1 à 60.
myArray = new Integer[6][10];
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray[i].length; j++) {
this.myArray[i][j] = i + 1;
}
}
}
Ce à quoi je m'attendais, c'était de sortir la somme de tous les éléments du tableau. J'ai essayé exactement la même chose avec des boucles for régulières, et cela a parfaitement fonctionné. Malheureusement, lorsque je suis passé aux boucles for améliorées, cela a cessé de fonctionner, ce qui m'a donné l'erreur:
Incompatibilité de type: impossible de convertir le type d'élément Integer [] en int
Voici à quoi ressemble mon constructeur:
ExerciseTwo () {
public void displayArrayProduct() {
DecimalFormat decimalFormat = new DecimalFormat("#.##");
decimalFormat.setGroupingUsed(true);
decimalFormat.setGroupingSize(3);
int p=1;
System.out.print("The product of all element of myArray is ");
for (int a : myArray) {
for (int b : myArray) {
p = p + myArray[a][b];
}
}
System.out.println(decimalFormat.format(p));
}
}
5 Réponses :
Mise à jour: Ma réponse d'origine a été publiée avant qu'il ne soit clair myArray est un tableau multidimensionnel. Compte tenu de cela, je suis d'accord avec Vecna - qui a également souligné à juste titre que l'utilisation de la boucle for-each vous permettrait d'obtenir l'entier lui-même au lieu de le référencer par index.
Réponse originale: Il semble que vous ayez changé quelque chose d'autre lorsque vous avez converti les boucles for.
L'expression myArray [a] [b] serait valide si myArray était un tableau multidimensionnel. Le problème est que vous essayez d'accéder à un tableau bidimensionnel, alors que le tableau lui-même est unidimensionnel.
Si vous essayez de multiplier les entrées en a et b, vous devez faire ceci:
p += myArray[a] * myArray[b];
ou en abrégé:
p = p + myArray[a] * myArray[b];
for (int[] a : myArray) {
for (int b : a) {
p = p + b;
}
}
Well the issue is a is an int array and not just an int.
Vous utilisez des pour-chaque boucles qui parcourent chaque élément d'un tableau ou collection. Ainsi, la chose que vous définissez dans la déclaration de boucle est un élément du tableau, plutôt qu'un index . Puisque vous utilisez un tableau à 2 dimensions (un tableau de tableaux), chaque élément de myArray est un tableau d'entiers, donc la première boucle doit être déclarée:
p = p + b;
Donc, chaque a valeur sera de type int [], et ce que vous voulez ensuite est d'obtenir chaque entier de chacun de ces tableaux d'entiers:
for (int b : a) {
Notez que vous obtenez chaque entier dans a, pas dans myArray. Vous pouvez maintenant référencer chaque entier du tableau comme étant simplement b, et non comme la valeur d'un tableau à l'index b:
for (int[] a : myArray) {
Il semble que myArray est un tableau de tableaux, pas un tableau d'entiers. C'est peut-être plus ce dont vous avez besoin?
for (int[] a: myArray) {
for (int b: a) {
p = p + b;
}
}
Peut-être que je me trompe et que je l'ai mal initialisé dans mon constructeur à ce moment-là.
J'ai ajouté mon code constructeur au bas de la question. Seriez-vous en mesure de l'examiner?
Ça semble bien. Cette ligne ici "myArray = new Integer [6] [10];" crée myArray sous la forme d'un tableau à deux dimensions, également appelé tableau de tableaux. Vous pouvez donc le considérer comme un tableau où chaque élément à l'intérieur est de type int [].
Puisque vous initialisez en utilisant "new Integer", vous devrez probablement changer la boucle for pour utiliser Integer [] au lieu de int []
Vous avez mentionné que vous aviez 60 éléments dans votre tableau, j'ai donc simplement créé un exemple de tableau 2 x 30 à titre d'exemple:
1770
Ensuite, si vous utilisez une boucle for-each , votre erreur se produit parce que chaque ligne individuelle du tableau en tant qu'INDEX DANS ELLE-MÊME. Ainsi, votre boucle for-each doit représenter être du type (int []) un int Array:
for(int[] x: myArray) {
for(int y: x) {
totalVal += y;
}
}
System.out.println(totalVal);
Dans chaque Array individuel (x), il y a une valeur primitive int donc nous exécutons une autre boucle for-each-loop afin d'extraire chaque valeur individuelle:
for (int y: x) {
Et voici votre code complet:
XXX
Et la sortie est la somme de chaque int dans le tableau:
for(int[] x: myArray) {