280 votes

Java, Comment obtenir l'index/clé actuel dans une boucle "for each" ?

En Java, comment obtenir l'indice actuel de l'élément en Java ?

for (Element song: question){
    song.currentIndex();         //<<want the current index.
}

En PHP, vous pourriez faire ceci :

foreach ($arr as $index => $value) {
    echo "Key: $index; Value: $value";
}

7 votes

Cette question est posée environ une fois par mois

0 votes

En PHP, vous utilisez un tableau associatif qui n'est pas synonyme de tableau de Java.

0 votes

Arrays.asList(question).indexOf(chanson)

407voto

Michael Mrozek Points 44120

Vous ne pouvez pas, vous devez soit garder l'index séparément :

int index = 0;
for(Element song : question) {
    System.out.println("Current index is: " + (index++));
}

ou utiliser une boucle for normale :

for(int i = 0; i < question.length; i++) {
    System.out.println("Current index is: " + i);
}

La raison est que vous pouvez utiliser la syntaxe for condensée pour boucler sur n'importe quel Iterable et il n'est pas garanti que les valeurs aient réellement un "indice".

7 votes

C'est en effet la réponse correcte d'un point de vue sémantique, car chaque boucle peut itérer à travers des données en continu provenant d'une base de données distante qui est mise à jour pendant que vous itérez à travers son contenu (si l'itérateur utilisé le fait réellement), auquel cas il n'y a aucun moyen de connaître l'index actuel. L'index est juste un voir aux données, et non une propriété des données.

1 votes

Même si ce n'est pas un indice, il serait très pratique d'avoir une sorte de compteur d'itération auquel on peut accéder à l'intérieur de la boucle. Je suppose qu'une telle chose peut difficilement aboutir dans le noyau java, plus de chances pour certains des langages de script.

0 votes

Comme je le craignais, peut-être que dans Java 12, ils l'ajouteront comme une fonctionnalité dont on pourra être fier, comme ils l'ont fait récemment avec les lambdas et la lecture de fichiers en une ligne ? (CLAUSE DE NON-RESPONSABILITÉ : je suis moi-même (principalement) un programmeur Java)

16voto

TheLQ Points 4361

En Java, vous ne pouvez pas, car foreach a été conçu pour cacher l'itérateur. Vous devez utiliser la boucle For normale pour obtenir l'itération actuelle.

13voto

Saher Points 2439

Gardez la trace de votre index : C'est ainsi que cela se passe en Java :

 int index = 0;
    for (Element song: question){
        // Do whatever
         index++;
    }

4 votes

C'est vrai, mais même si j'aime beaucoup la boucle for-each améliorée introduite dans Java5, le fait de fournir votre propre index ne va-t-il pas à l'encontre de l'objectif d'utiliser simplement la construction for-each traditionnelle ? L'utilisation de ce qui est intégré à Java est souvent plus intuitive/lisible (mais pas toujours) pour le développeur Java.

7 votes

7 ans plus tard... ( wow je ne peux pas le croire, le temps passe vite) , je suis d'accord avec vous @MichaelM 100%.

8voto

EdenB Points 41
###################################################
###################################################
###################################################
AVOID THIS
###################################################
###################################################
###################################################

/*for (Song s: songList){
    System.out.println(s + "," + songList.indexOf(s); 
}*/

c'est possible dans une liste liée.

vous devez faire toString() dans la classe de chanson. Si vous ne le faites pas, il imprimera la référence de la chanson.

probablement sans intérêt pour vous maintenant. ^_^

33 votes

Ugly hack......

84 votes

Comme les gens l'ont commenté stackoverflow.com/a/5200217 ce qui est faux s'il y a des éléments en double et est O(n²) lent.

34 votes

Terrible, terrible, terrible. S'il vous plaît, ne jamais faites-le.

5voto

Zeffer Points 37

Impossible en Java.


Voici la méthode Scala :

val m = List(5, 4, 2, 89)

for((el, i) <- m.zipWithIndex)
  println(el +" "+ i)

0 votes

1 votes

Je pensais la même chose. J'aime aussi la syntaxe Javascript : myArray.forEach((val, index) => console.log('VAL : ', val, 'INDEX : ', index) );

0 votes

La question porte sur Java, pas sur la JVM : désolé, mais Scala est hors de portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X