Java: initialiser plusieurs variables dans for loop init?

92

Je veux avoir deux variables de boucle de types différents. Y a-t-il un moyen de faire fonctionner cela?

@Override
public T get(int index) throws IndexOutOfBoundsException {
    // syntax error on first 'int'
    for (Node<T> current = first, int currentIndex; current != null; 
            current = current.next, currentIndex++) {
        if (currentIndex == index) {
            return current.datum;
        }
    }
    throw new IndexOutOfBoundsException();
}
Nick Heiner
la source
Qu'est-ce que c'est first? Il n'est déclaré nulle part. Est-ce un membre de la classe?
extraneon
7
Vous devriez accepter une réponse ci
Mr_and_Mrs_D
Et contrairement au C, Java n'a pas l'opérateur virgule: stackoverflow.com/questions/12601596/… , qui permettrait d'initialiser (mais pas de déclarer) deux variables de types différents.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Nick Heiner Pourriez-vous s'il vous plaît marquer l'une des réponses ci-dessous comme acceptée?
James Monger

Réponses:

105

L' initialisation d'unefor instruction suit les règles des déclarations de variables locales .

Ce serait légal (si idiot):

for (int a = 0, b[] = { 1 }, c[][] = { { 1 }, { 2 } }; a < 10; a++) {
  // something
}

Mais essayer de déclarer les types distincts Nodeet intcomme vous le souhaitez n'est pas légal pour les déclarations de variables locales.

Vous pouvez limiter la portée des variables supplémentaires dans les méthodes en utilisant un bloc comme celui-ci:

{
  int n = 0;
  for (Object o = new Object();/* expr */;/* expr */) {
    // do something
  }
}

Cela garantit que vous ne réutilisez pas accidentellement la variable ailleurs dans la méthode.

McDowell
la source
10
Quelqu'un a-t-il une idée de la raison pour laquelle les concepteurs de langage ont mis en œuvre cette contrainte apparemment inutile?
Jeff Axelrod
@glenviewjeff - il serait préférable de poser une question distincte.
McDowell
2
@JeffAxelrod, peut-être pour des raisons historiques car Java a été modélisé après C ++ ... voir ce post: stackoverflow.com/questions/2687392/…
Christophe Roussy
3
+1 pour utiliser un bloc, je les utilise beaucoup, encore mieux que de faire des erreurs stupides
Christophe Roussy
18

Vous ne pouvez pas aimer ça. Soit vous utilisez plusieurs variables du même type, for(Object var1 = null, var2 = null; ...)soit vous extrayez l'autre variable et la déclarez avant la boucle for.

Colin Hebert
la source
9

Déplacez simplement les déclarations de variables ( Node<T> current, int currentIndex) en dehors de la boucle et cela devrait fonctionner. Quelque chose comme ça

int currentIndex;
Node<T> current;
for (current = first; current != null; current = current.next, currentIndex++) {

ou peut-être même

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {
Nikita Rybak
la source
1
Ni l'un ni l'autre ne compilera: vous devez initialiser les variables avant utilisation.
unbeli
@unbeli eh bien, je ne m'entraînais pas à la compilation manuelle de code :) Je voulais juste donner l'idée.
Nikita Rybak
3
@unbeli: Juste pour clarifier: currentIndex doit être initialisé. La première chose que Nikita lui fait est "currentIndex ++", qui soulève naturellement la question, incrémenter quoi? courant est bien parce que la première utilisation est de le régler en premier.
Jay
Habituellement, pour mieux écrire une incrémentation dans une boucle for, il faut utiliser ++ var comme notation var ++ requise du compilateur pour dupliquer le contenu de var avant de l' incrémenter pour le renvoyer comme résultat de l'expression bien que personne ne le veuille jamais. Bien sûr, le compilateur optimisera cela, mais c'est comme jeter des déchets sur la route en attendant que les autres nettoient.
Chucky
5

Les variables déclarées dans le bloc d'initialisation doivent être du même type

nous ne pouvons pas initialiser les différents types de données dans la boucle for selon leur conception. Je donne juste un petit exemple.

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
Vishnu Prasanth G
la source