2010-08-22 10 views
70

Quiero tener dos variables de bucle de diferentes tipos. ¿Hay alguna manera de hacer funcionar esto?Java: Inicializa múltiples variables en for loop init?

@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(); 
} 
+0

¿Qué es 'first'? No está declarado en ningún lado. ¿Es un miembro de la clase? – extraneon

+6

Debe aceptar una respuesta debajo de –

+0

Y a diferencia de C, Java no tiene el operador de coma: http://stackoverflow.com/questions/12601596/java-comma-operator-outside-for-loop-declaration, que permitiría inicializa (pero no declara) dos variables de diferentes tipos. –

Respuesta

6

sólo hay que mover las declaraciones de variables (Node<T> current, int currentIndex) fuera del bucle 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++) { 
+1

Ninguno compilará: debe inicializar las variables antes de su uso. – unbeli

+0

@unbeli bueno, no estaba haciendo ejercicio en la compilación manual de código :) Solo quería dar la idea. –

+2

@unbeli: Solo para aclarar: currentIndex necesita ser inicializado. Lo primero que le hace Nikita es "currentIndex ++", lo que naturalmente hace surgir la pregunta, ¿incrementar qué? la corriente está bien porque el primer uso es establecerlo primero. – Jay

14

Usted no puede de esta manera. O utiliza múltiples variables del mismo tipo for(Object var1 = null, var2 = null; ...) o extrae la otra variable y la declara antes del bucle for.

84

La declaración initialization of a for sigue las reglas para local variable declarations.

Esto sería legal (si es tonta):

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

Pero tratar de declarar las distintas Node y int tipos como usted quiere 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 de la siguiente manera:

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

Esto asegura que no emplee accidentalmente la variable en el método en otros lugares.

+7

¿Alguien tiene alguna idea de por qué los diseñadores de idiomas implementaron esta restricción aparentemente innecesaria? –

+0

@glenviewjeff - eso sería mejor preguntarlo como una pregunta separada. – McDowell

+0

@JeffAxelrod, tal vez por razones históricas porque Java fue modelado después de C++ ... ver esta publicación: http://stackoverflow.com/questions/2687392/is-it-possible-to-declare-two-variables-of-different -types-in-a-for-loop –