Java Verschachtelte Schleifen
Schleifen in Java verschachteln, um mehrdimensionale Daten, Matrizen und Gitter effizient zu verarbeiten.
Eine verschachtelte Schleife ist eine Schleife innerhalb einer anderen Schleife. Die innere Schleife läuft bei jedem Durchlauf der äußeren Schleife vollständig durch, sodass der Rumpf äußere × innere Mal ausgeführt wird. Dies ist die grundlegende Struktur für alle Probleme, die Zeilen und Spalten, Paare oder mehrdimensionale Daten betreffen.
Dieses Kapitel setzt voraus, dass Sie die grundlegenden Schleifenformen kennen — die for-Schleife und die while-Schleife. Jede Schleife kann in eine andere verschachtelt werden; die folgenden Beispiele verwenden for, da dies am häufigsten vorkommt, aber die Regel gilt ebenso für while und for-each.
Zwei for-Schleifen
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println(i + "," + j);
}
}Ausgabe:
1,1
1,2
1,3
2,1
2,2
2,3
3,1
3,2
3,3Für jeden Wert von i durchläuft die innere Schleife j von 1 bis 3, bevor i weitergeht. Beachten Sie, dass j bei jedem äußeren Durchlauf auf 1 zurückgesetzt wird — die innere Schleife beginnt jedes Mal von vorne, wenn die äußere Schleife wiederholt wird. Halten Sie die Schleifenvariablen eindeutig (hier i und j); die Wiederverwendung desselben Namens in beiden Schleifen ist eine häufige Fehlerquelle.
Durchlaufen eines 2D-Arrays
Die klassische Anwendung verschachtelter Schleifen ist das Iterieren über eine Matrix:
int[][] grid = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
System.out.print(grid[r][c] + " ");
}
System.out.println();
}Jede Zeile des Gitters ist selbst ein array; die äußere Schleife iteriert über Zeilen, die innere Schleife über die Zellen in jeder Zeile. Die for-each-Form ist noch übersichtlicher, wenn Sie die Indizes nicht benötigen:
for (int[] row : grid) {
for (int cell : row) {
System.out.print(cell + " ");
}
System.out.println();
}Muster ausgeben
Verschachtelte Schleifen sind eine klassische Übung zum Ausgeben von Mustern. Ein Dreieck aus Sternen:
int rows = 5;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}Ausgabe:
*
**
***
****
*****Die Anzahl der inneren Schleife hängt von der Variable der äußeren Schleife ab — ein mächtiges Muster, das immer wieder auftaucht.
Auf die Komplexität achten
Eine einzelne Schleife über n Elemente läuft n Mal. Eine darin verschachtelte Schleife läuft n × n = n² Mal. Drei verschachtelte Schleifen laufen n³ Mal. Für kleine n spielt das keine Rolle; für große n ist es sehr bedeutsam:
| n | n² | n³ |
|---|---|---|
| 10 | 100 | 1,000 |
| 100 | 10,000 | 1,000,000 |
| 1,000 | 1,000,000 | 1,000,000,000 |
Wenn Ihre verschachtelte Schleife über einen großen Datensatz läuft, fragen Sie sich, ob Sie die innere Schleife wirklich benötigen. Eine HashMap-Suche ersetzt oft eine innere Suchschleife und verwandelt O(n²) in O(n).
break und continue wirken nur auf die innere Schleife
Wie wir bei break und continue gesehen haben: Ohne ein Label wirken beide nur auf die innerste Schleife. Um aus der äußeren Schleife auszubrechen oder deren Iteration von innen zu überspringen, verwenden Sie ein beschriftetes break oder continue — siehe beschriftete Anweisungen.
Ein ausgearbeitetes Beispiel
Was kommt als Nächstes
Wenn Sie break oder continue für eine äußere Schleife von innen heraus benötigen, bieten beschriftete Anweisungen einen sauberen Weg dafür.