2010-12-15 20 views
0

Ich konvertierte eine Reihe von normalen for-Schleifen zu for-each-Schleifen in meinem letzten Projekt und stieß auf ein paradoxes Problem.Java For-Each-Schleife Datentyp

imgMap = new int[rows][cols]; 

    for (int r=0; r<imgMap.length; r++) { 
     rowArray = mapBR.readLine().split(","); 
     for (int c=0; c<imgMap[r].length; c++) { 
      imgMap[r][c] = Integer.parseInt(rowArray[c]); 
     } 
    } 

    System.out.println(imgMap.length+", "+imgMap[0].length); 

    // print array in rectangular form 
    for (int[] r : imgMap) { 
     for (int[] c : imgMap[r]) { 
      System.out.print(" " + c[0]); 
     } 
     System.out.println(""); 
    } 

imgMap ist ein zweidimensionales int array (int[][])
ein ‚Karte‘ zu halten mapBR ist ein BufferedReader der externen Datei, die die ‚Karte‘ von
Die ersten genommen wird Nested for Loop-Set liest die Datei, die zweite verschachtelte für jedes Set schreibt es in die Konsole, um sicherzustellen, dass es richtig gelesen wird.

Ich konnte keinen Weg sehen, den ersten for-Schleife-Set-Arbeit als für-jede Schleifen, so dass ein Teil-Problem wäre ich würde mich freuen, wenn jemand mir auch helfen könnte.

Wie auch immer, zurück zum Hauptproblem. Wenn ich (versuche) dies zu kompilieren, gibt der Compiler einen Fehler zurück, der besagt, dass die int[] c : imgMap[r] Zeile inkompatible Typen hat, aber, und hier ist der Haken, wenn ich ihn auf int c : imgMap[r], ändere, hustet es den gleichen Fehler! Da ich nicht sehen kann, wie es anders sein könnte als einer dieser Typen bin ich verwirrt.

Ich hoffe, ich habe genug Informationen zur Verfügung gestellt.

IAmThePiGuy

+0

dankt allen, die so schnell beantwortet, es erstaunt mich immer noch die Wärme dieser Online-Community. Übrigens, wenn jemand einen Weg finden könnte, das verschachtelte für Set in ein verschachteltes für jedes Set ähnlich zu machen, wäre ich dankbar. – cortices

+0

Alles wurde gelöst und Happy Compiler! – cortices

Antwort

4

In der ersten Schleife codieren, müssen Sie c eine int so sein, dass Sie rowArray[c] zugreifen können - aber das sollte funktionieren:

for (int[] row : imgMap) { 
    String[] rowArray = mapBR.readLine().split(","); 
    for (int c = 0; c < row.length; c++) { 
     row[c] = Integer.parseInt(rowArray[c]);    
    } 
} 

In der zweiten Schleife, müssen Sie nur durchiterieren, nicht durch imgMap[r]:

for (int[] row : imgMap) { 
    for (int value : row) { 
     System.out.print(" " + value); 
    } 
    System.out.println(""); 
} 

Grundsätzlich müssen Sie sorgfältig über die Typen beteiligt denken -, ob eine Variable einen Index in ein Array darstellt, oder das Array selbst.

+0

Wow ... Ich habe eine Antwort von THE Jon Skeet garantiert! Danke, das ist genau das, was ich wollte. – cortices

3
int[] c : imgMap[r] 

als Index der Array es int dauert und Sie haben int[] geliefert

Es sollte

for (int[] r : imgMap) { 
     for (int c : r) { 
      System.out.print(" " + c); 
     } 
     System.out.println(""); 
    } 
3

sein Dieses ist, wie es funktioniert:

Die äußere for-Schleife stellt alle Zeilen aus der Matrix bereit, die innere for-Schleife alle Zellen aus einer Zeile.

4

Sie versuchen, r zu verwenden, die eine int [] ist, wie nur int. Es ist falsch. Fix es

for (int c : r) { 
    ... 
} 
2

Sie bräuchten

for (int c : r) 
3
for (int[] r : imgMap) { 
    for (int c : r) { 
     System.out.print(" " + c); 
    } 
    System.out.println(""); 
} 
3

Wenn ich diese richtig verstehen muss es so sein:

for (int[] r : imgMap) { 
     for (int c : r) { 
      ... 
     } 
     ... 
    }