Java: inizializza più variabili in for loop init?


92

Voglio avere due variabili di ciclo di diversi tipi. C'è un modo per farlo funzionare?

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

Che cos'è first? Non è dichiarato da nessuna parte. È un membro della classe?
extraneon

7
Dovresti accettare una risposta di seguito
Mr_and_Mrs_D

E a differenza di C, Java non ha l'operatore virgola: stackoverflow.com/questions/12601596/… , che consentirebbe di inizializzare (ma non dichiarare) due variabili di diverso tipo.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@ Nick Heiner Potresti contrassegnare una delle seguenti risposte come accettata?
James Monger

Risposte:


105

L' inizializzazione difor un'istruzione segue le regole per le dichiarazioni di variabili locali .

Questo sarebbe legale (se stupido):

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

Ma provare a dichiarare i distinti Nodee i inttipi come si desidera non è legale per le dichiarazioni di variabili locali.

È possibile limitare l'ambito di variabili aggiuntive all'interno dei metodi utilizzando un blocco come questo:

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

Ciò garantisce di non riutilizzare accidentalmente la variabile altrove nel metodo.


10
Qualcuno ha idea del perché i progettisti del linguaggio abbiano implementato questo vincolo apparentemente non necessario?
Jeff Axelrod

@glenviewjeff: sarebbe meglio se fosse una domanda separata.
McDowell

2
@JeffAxelrod, forse per ragioni storiche perché Java è stato modellato su C ++ ... guarda questo post: stackoverflow.com/questions/2687392/…
Christophe Roussy

3
+1 per usare un blocco, li uso molto, ancora meglio che fare errori stupidi
Christophe Roussy

18

Non ti piace questo. O usi più variabili dello stesso tipo for(Object var1 = null, var2 = null; ...)o estrai l'altra variabile e la dichiari prima del ciclo for.


9

Basta spostare le dichiarazioni di variabili ( Node<T> current, int currentIndex) fuori dal ciclo e dovrebbe funzionare. Qualcosa come questo

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

o forse anche

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

1
Nessuno dei due verrà compilato: devi inizializzare le variabili prima dell'uso.
unbeli

@unbeli beh, non stavo esercitando nella compilazione manuale del codice :) Volevo solo dare l'idea.
Nikita Rybak

3
@unbeli: Giusto per chiarire: currentIndex deve essere inizializzato. La prima cosa che Nikita fa è "currentIndex ++", che naturalmente solleva la domanda, incrementare cosa? corrente va bene perché il primo utilizzo è impostarlo per primo.
Jay,

Di solito per scrivere meglio un incremento in un ciclo for, si dovrebbe usare ++ var come notazione var ++ richiesta dal compilatore per duplicare il contenuto del var prima di incrementarlo per restituirlo come risultato dell'espressione sebbene nessuno lo voglia mai. Ovviamente, il compilatore lo ottimizzerà, ma è come gettare spazzatura in strada aspettando che gli altri puliscano.
Chucky

5

Le variabili dichiarate nel blocco di inizializzazione devono essere dello stesso tipo

non possiamo inizializzare i diversi tipi di dati nel ciclo for secondo il loro design. Sto solo facendo un piccolo esempio.

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.