Java: inicializar várias variáveis ​​em for loop init?

93

Eu quero ter duas variáveis ​​de loop de tipos diferentes. Existe alguma maneira de fazer isto funcionar?

@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
fonte
O que é first? Não está declarado em lugar nenhum. É um membro da classe?
extraneon
8
Você deve aceitar uma resposta abaixo
Mr_and_Mrs_D
E, ao contrário de C, Java não tem o operador vírgula: stackoverflow.com/questions/12601596/… , que permitiria inicializar (mas não declarar) duas variáveis ​​de tipos diferentes.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Nick Heiner Você poderia marcar uma das respostas abaixo como aceita?
James Monger

Respostas:

106

A inicialização de umafor instrução segue as regras para declarações de variáveis ​​locais .

Isso seria legal (se bobo):

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

Mas tentar declarar os tipos distintos Nodee intcomo você deseja não é legal para declarações de variáveis ​​locais.

Você pode limitar o escopo de variáveis ​​adicionais dentro dos métodos usando um bloco como este:

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

Isso garante que você não reutilize acidentalmente a variável em outro lugar no método.

McDowell
fonte
11
Alguém tem alguma ideia de por que os designers de linguagem implementaram essa restrição aparentemente desnecessária?
Jeff Axelrod
@glenviewjeff - seria melhor fazer uma pergunta separada.
McDowell
2
@JeffAxelrod, talvez por razões históricas porque Java foi modelado após C ++ ... veja este post: stackoverflow.com/questions/2687392/…
Christophe Roussy
19

Você não pode gostar disso. Você usa várias variáveis ​​do mesmo tipo for(Object var1 = null, var2 = null; ...)ou extrai a outra variável e a declara antes do loop for.

Colin Hebert
fonte
10

Basta mover as declarações de variáveis ​​( Node<T> current, int currentIndex) para fora do loop e deve funcionar. Algo assim

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

ou talvez até

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {
Nikita Rybak
fonte
2
Nenhum dos dois compilará: você deve inicializar as variáveis ​​antes de usar.
unbeli de
@unbeli bem, eu não estava me exercitando na compilação manual de código :) Só queria dar uma ideia.
Nikita Rybak
4
@unbeli: Só para esclarecer: currentIndex precisa ser inicializado. A primeira coisa que a Nikita faz é "currentIndex ++", que naturalmente levanta a questão, incrementar o quê? current está bom porque o primeiro uso é defini-lo como primeiro.
Jay
Normalmente, para escrever melhor uma incrementação em um loop for, deve-se usar ++ var como a notação var ++ exigida do compilador para duplicar o conteúdo de var antes de incrementá-lo para retorná-lo como o resultado da expressão, embora ninguém queira isso. Claro, o compilador irá otimizar isso, mas é como jogar lixo na estrada esperando que outros façam a limpeza.
Chucky
5

As variáveis ​​declaradas no bloco de inicialização devem ser do mesmo tipo

não podemos inicializar os diferentes tipos de dados no loop for de acordo com seu design. Estou apenas dando um pequeno exemplo.

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
fonte