Java: ¿Inicializar múltiples variables en for loop init?

92

Quiero tener dos variables de ciclo de diferentes tipos. ¿Hay alguna manera de hacer funcionar esto?

@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
fuente
¿Qué es first? No se declara en ninguna parte. ¿Es un miembro de la clase?
extraneon
7
Debe aceptar una respuesta a continuación
Mr_and_Mrs_D
Y a diferencia de C, Java no tiene el operador de coma: stackoverflow.com/questions/12601596/… , que permitiría inicializar (pero no declarar) dos variables de diferentes tipos.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Nick Heiner ¿Podría marcar una de las siguientes respuestas como aceptada?
James Monger

Respuestas:

105

La inicialización de unafor declaración sigue las reglas para declaraciones de variables locales .

Esto sería legal (aunque tonto):

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

Pero intentar declarar los tipos distintos Nodey intcomo desee no es legal para las declaraciones de variables locales.

Puede limitar el alcance de las variables adicionales dentro de los métodos mediante el uso de un bloque como este:

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

Esto asegura que no reutilice accidentalmente la variable en otra parte del método.

McDowell
fuente
10
¿Alguien tiene alguna idea de por qué los diseñadores de lenguajes implementaron esta restricción aparentemente innecesaria?
Jeff Axelrod
@glenviewjeff: es mejor hacerla como una pregunta separada.
McDowell
2
@JeffAxelrod, tal vez por razones históricas porque Java fue modelado después de C ++ ... vea esta publicación: stackoverflow.com/questions/2687392/…
Christophe Roussy
3
+1 por usar un bloque, los uso mucho, aún mejor que cometer errores tontos
Christophe Roussy
18

No te puede gustar esto. O usa múltiples variables del mismo tipo for(Object var1 = null, var2 = null; ...)o extrae la otra variable y la declara antes del ciclo for.

Colin Hebert
fuente
9

Simplemente mueva las declaraciones de variables ( Node<T> current, int currentIndex) fuera del ciclo y debería funcionar. Algo como esto

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

o tal vez incluso

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {
Nikita Rybak
fuente
1
Ninguno de los dos compilará: debe inicializar las variables antes de usarlas.
unbeli
@unbeli bueno, no estaba ejercitando en la compilación manual de código :) Solo quería dar la idea.
Nikita Rybak
3
@unbeli: Solo para aclarar: currentIndex debe inicializarse. Lo primero que le hace Nikita es "currentIndex ++", que naturalmente plantea la pregunta, ¿incrementar qué? current está bien porque el primer uso es configurarlo como primero.
Jay
Por lo general, para escribir mejor un incremento en un bucle for, se debe usar ++ var como la notación var ++ requerida del compilador para duplicar el contenido de var antes de incrementarlo para devolverlo como resultado de la expresión, aunque nadie quiere eso. Por supuesto, el compilador optimizará eso, pero es como tirar basura en el camino esperando que otros limpien.
Chucky
5

Las variables declaradas en el bloque de inicialización deben ser del mismo tipo

no podemos inicializar los diferentes tipos de datos en el bucle for según su diseño. Solo estoy poniendo un pequeño ejemplo.

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
fuente