Skip to main content

Java for Schleifen schachteln – So funktioniert es

Diese Situation kennst du doch auch….
Du stehst an der Haltestelle und wartest auf den Bus.
Dein Blick fällt auf die Uhr.
 
Oder du wartest an der Ecke auf deinen Freund oder Kollegen.
Immer wieder schaust du auf deine Uhr.
 
Sie ist kaum noch wegzudenken.
Die mobile Taschenuhr.
 
Lange Zeit wurde die Erfindung der Taschenuhr dem deutschen Schlossermeister Peter Henlein zugeschrieben.
Heute glauben Historiker, dass die Wurzeln der Taschenuhr – viel weiter zurückliegen.
 
Dennoch gehören die Henlein-Uhren zu den ältesten erhaltenen Exemplaren.
Und die deutschen Städte Augsburg und Nürnberg wurden, im 16 Jahrhundert, zu echten Hochburgen der Uhrmacherkunst.
 
Aber wie funktioniert eigentlich so eine Taschenuhr?
Und was hat das Ganze Uhrwerk mit Java for Schleifen zu tun?
 
Diese beiden Fragen möchte ich in diesem Beitrag beantworten.
Es bleibt also spannend.

Die Java For Schleife am Beispiel eines Uhrwerkes.

Taschenuhr

Taschenuhr Quelle: Amazon

Schau dir einmal das Bild zur Uhr an.

So ein Uhrwerk besteht aus verschiedenen Zahnrädern, welche in einer bestimmten Beziehung stehen.

Wie du sicherlich siehst….
Die Zahnräder einer Uhr sind unterschiedlich groß.

Und diese unterschiedliche Größe ist enorm wichtig.

Denn dadurch werden bestimmte Umdrehungsanzahlen (blödes Wort) von einem Rad auf das Nächste übergeben.

Java for Schleife Zahnräder

Im Klartext bedeutet dies.
Wenn sich das große Zahnrad einmal dreht, drehen sich die kleineren mehrmals.
 
Und wie oft bei einer Uhr?
Angenommen das große Rad hängt am Stundenzeiger der Uhr.
Und das nächst kleinere Zahnrad hängt am Minutenzeiger der selben Uhr.
 
Bei jeder Drehung des großen Rades (1 Stunde) müsste sich das kleine Rad – genau 60-ig mal drehen. (1 Stunde = 60 Minuten).
 
Wie kannst du dies in einem Java Programm simulieren?
Klar mit Schleifen – am besten mit for Schleifen.
 

So kannst du dir eine geschachtelte Java For Schleife am Beispiel vorstellen.

Wir bleiben vorerst bei der Uhr.
Denn dieses gedankliche Modell ist prädestiniert, um Schachtelung in Java For Schleifen darzustellen.
 
Wir sagten:

  • Stundenzeiger bzw. Stundenzahnrad 1 Umlauf
  • Minutenzeiger bzw. Minutenzahnrad 60 Durchläufe

Du benötigst also eine innere und eine äußere Schleife.
Und die innere For Schleife wird vollständig von der äußeren Schleife umfasst.

Java for Schleifen schachteln Aufbau

Die Grenzen sind somit klar abgesteckt.
 
Doch was passiert jetzt in den geschachtelten For Schleifen?
Immer wenn in der äußeren Schleife ein Durchlauf stattfindet – finden in der inneren Schleife 60 Durchläufe statt.
Dies entspricht dann der Umrechnung von Stunde zu Minuten.
Klar, oder?
Java for Schleifen schachteln Aufbau Durchlauf

So kannst du for Schleifen in Java schachteln

Beginnen wir mit der äußeren Schleife – der Stundenanzeige.
 
Im Kopf befindet sich die Zählvariable, welche bei 0 startet.
Somit lautet diese int i = 0

Java for Schleifen schachteln äußere Schleife Aufbau

Die Schleife soll solange durchlaufen werden, bis i den Wert 23 hat.
24 Stunden ist ein Tag.
Und deshalb lautet die Schleifenbedingung: i < 24
Java for Schleifen schachteln Schleifenbedingung

Selbstverständlich wird i nach jedem Durchlauf um eins erhöht.
i++ 
Java For Schleifen schachteln Inkrementierung

Somit würde i bei 24 Durchläufen folgende Werte haben:

  • 1. Durchlauf i = 0
  • 2. Durchlauf i = 1
  • 3. Durchlauf i = 2
  • 4. Durchlauf i = 3
  • 24. Durchlauf i =23

Nach 24 Durchläufen hat i den Wert 23.
Die Abbruchbedingung "i < 24" ist erfüllt und somit wäre ein neuer Durchlauf nicht möglich. Und so sieht der Java Code zur äußeren for Schleife aus.

public class JavaForFor {

	public static void main(String[] args) {

		for (int i = 0; i < 24; i++) {
			System.out.println(i);

		}
	}
}

Ich habe dazu eine neue Klasse angelegt.
Die for-Schleife habe ich gleich in die main-Methode implementiert.
Somit startet die Schleife gleich und immer beim Programmstart.
 
PS:
Im Schleifenrumpf habe ich eine Bildschirmausgabe zu "i" integriert.
Diese soll lediglich eine Kontrolle sein, ob alle Stundenzahlen ordnungsgemäß angezeigt werden.
Später - macht dies komplett die innere Schleife.
 

Na dann schauen wir uns die innere Schleife einmal an.

Beginnen wir wieder beim Aufbau und somit beim Schleifenkopf.

Java For Schleifen Schachtelung

Wie du auf dem Bild sehen kannst….
Die äußere Schleife (schwarzer Code) umschließt komplett die innere Schleife.
 
Jetzt kümmern wir uns nur noch um den inneren Schleifenkopf.
Und zwar nach genau dem gleichen Muster.
 
Die Zählvariable startet bei 0.
Diese nenn ich "j", da der Name "i" bereits vergeben ist.
Stichwort - Shadowing.
 
Somit beginnt der Schleifenkopf auch hier mit: int j = 0.
Java for Schleifen schachteln Innere Klasse Zählen

Die Schleifenbedingung lautet: j < 60.
Somit musst du die Skalierung von 24 auf 60 ändern.
Java for Schleifen schachteln Innere Schleife Schleifenbedingung

Somit generiert die Schleife 60 Durchläufe.
Nach jedem Durchlauf wird die Variable "j" um eins erhöht.
Java for Schleifen innere Schleife Inkrement

Wie du sicherlich bemerkt hast...
Die Beschreibung im Bild müsste lauten, bis "j = 59" ist.

Also dann...
So sehen dann die Schleifendurchläufe in der Theorie aus:

  • 1. Durchlauf j = 0
  • 2. Durchlauf j = 1
  • 3. Durchlauf j = 2
  • 60. Durchlauf j = 59

Im Schleifenrumpf soll jetzt eine Bildschirmausgabe die Zeitzählung ausgeben.
Dazu werden:

  • "I" - Zählvariable aus der äußeren Schleife
  • Und "j" - die Zählvariable aus der inneren Schleife ausgeben.
  • Schick gemacht mit etwas Standardtext und fertig.

So sieht der Java Code für zwei geschachtelte for Schleifen aus:

public class JavaForFor {

	public static void main(String[] args) {

		for (int i = 0; i < 24; i++) {

			for (int j = 0; j < 60; j++) {
				System.out.println("ZEIT: " + i + ":" + j);
			}//Ende innere Schleife
		}//Ende äußere for Schleife
	}//Ende der Main-Methode
}//Ende der Java Klasse

Klicke auf "RUN" und genieß die Show. 🙂
 

Achte bei geschachtelten Java Schleifen stets auf die Zählvariablen.

Es handelt sich immer um lokale Variablen.
Und diese existieren immer nur innerhalb der Programmstrukturen - in welcher sie auch angelegt worden.
 
Ich mach dies einmal am Bild deutlich.

Java For Schleifen schachteln äußere lokale Variable

"I" wurde in der äußeren Schleife angelegt.
Und da die innere Schleife ein Teil der äußeren Schleife ist, existiert "I" auch in dieser.
 
"J" hingegen wurde in der inneren Schleife angelegt.
Und existiert nur in dieser Programmstruktur.
Java For Schleifen schachteln innere lokale Variable

Die Klammer, welche die innere Schleife schließt - bewirkt somit, dass "j" zerstört wird.
Du kannst somit "j" nicht in der äußeren Schleife nutzen bzw. auf "j" zugreifen.
 
So etwas wie das hier funktioniert somit nicht:

public class JavaForFor {

	public static void main(String[] args) {

		for (int i = 0; i < 24; i++) {
			System.out.println(j);//Fehler denn j existiert noch nicht
			
			for (int j = 0; j < 60; j++) {
				System.out.println("ZEIT: " + i + ":" + j);
				
			}//Ende der inneren Schleife - j wird zerstört
			
			System.out.println(j);//Fehler denn j existiert nicht mehr
		}
	}
}

 

Natürlich kannst du den Schleifenzähler auch rückwärts zählen lassen.

Stichwort Timer - Die Zeit läuft rückwärts ab.
 
Wie bei jeder for-Schleife kannst du natürlich eine oder beide Zählvariablen auch runterzählen lassen.
Du beginnst bei 60 und endest bei 0.
 
So sieht das Ganze dann aus.

public class JavaForFor {

	public static void main(String[] args) {

		for (int i = 0; i < 24; i++) { 
                    for (int j = 60; j >= 0; j--) {
			System.out.println("ZEIT: " + i + ":" + j);

			}
		}
	}
}

Probiere es selbst aus und klicke auf "RUN".
 
Was habe ich verändert?
Die äußere Schleife bleibt gleich.
Aber die innere Schleife startet jetzt nicht bei "j=0", sondern bei "j=60".
 
Die Schleifenbedingung habe ich ebenfalls verändert.
Ursprünglich lautete diese: "j<60". Jetzt soll "j" solange heruntergezählt werden, bis "j >= 0".
 
Und natürlich darf nach jedem Schleifendurchlauf nicht mehr nach oben gezählt werden.
Sondern "J" muss kleiner werden.
Aus "j++" wurde "j--".
 
Cool, oder?
Aber da geht noch mehr…
 

Diese Java For Schleifen Schachtelung kannst du auch mit unterschiedlichen Datentypen vollziehen.

Ich führe nochmal ein zweites – komplett neues Beispiel ein.
Und zwar ein Inhaltverzeichnis.
 
Der Aufbau könnte so aussehen:
Kapitel 1
Kapitel 1 A
Kapitel 1 B
Kapitel 1 C
 
Später dann geht es mit dem zweiten Kapitel weiter:
Kapitel 2
Kapitel 2 A
Kapitel 2 B
 
Und immer so weiter.
Das letzte Kapitel lautet: Kapitel "100 Z".
 
Also was brauchen wir dafür?
Wieder zwei for-Schleifen.
 
Die äußere for-Schleife zählt die Kapitel von 1 bis 100.
Und die innere for Schleife ergänzt die Buchstaben.
 
Da jeder Buchstabe lediglich nur ein Schriftzeichen ist, kannst du einen Character-Datentyp für die innere Schleife verwenden.
In einer früheren Übung haben wir dies schon einmal umgesetzt.
 
Hier die zwei Schleifen:

public class JavaForFor {

	public static void main(String[] args) {

		for (int i = 1; i <= 100; i++) {
			for (char zeichen = 65; zeichen <= 90; zeichen++) {
				System.out.println("Kapitel: " + i + " " + zeichen);
			}
		}
	}
}

Die äußere Schleife ist klar, oder?
 
Die innere Schleife beginnt bei char zeichen = 65.
Und zwar deshalb, weil hinter diesem internen "Char-Index" das große "A" steckt.
 
Das ganze endet dann bei char zeichen <=90.
Denn hier steckt das große "Z".
 
Klicke auf "RUN" und genieße die letzte Konsolenausgabe für heute.
Ich hoffe- du hattest Spaß.
 
Zusammenfassung:

  • Bei der Java Programmierung kannst du for Schleifen schachteln.
  • Dies ist mitunter sehr hilfreich um eine bestimmte Anzahl an inneren Schleifendurchläufen zu erzwingen.
  • Dazu musst du lediglich, im Inneren einer bereits bestehenden for-Schleife, eine zweite for-Schleife einfügen.
  • Achte dabei unbedingt auf die lokale Zählvariable.
    Denn - Wie in jedem anderen Programmkonstrukt existieren lokale Variablen nur innerhalb der for-Schleife, in welcher sie angelegt worden sind.

Ähnliche Beiträge

Beim Aufruf werden Java Methoden auf dem Stack gestapelt

Java Methoden gestapelt

Java Methoden werden beim Aufruf gestapelt. Und jedes Element auf dem Stapel nimmt Speicherplatz weg. Und manchmal ist es so, dass der Stapel richtig hoch wird und dann…. Ja was passiert eigentlich dann? Betrachten wir einmal ein Computerspiel. Irgendeines. In diesem Computerspiel gibt es Vögel, welche abgeschossen werden sollen. Was bedeutet das denn genau? Beim […]

Verwalte deine Java Klassen in packages

java klassen verwalten

Es macht durchaus Sinn deine Java Klassen in verschiedenen Paketen zu organisieren. Wieso? Es sprechen mehrere Gründe dafür: Du kannst doppelte Klassennamen verwenden Du kannst deinen Code oder deine Klassen inhaltlich trennen Du kannst Hierarchien abbilden. Und genau um diese Dinge geht es in diesem Beitrag

So legst du Utility Klassen in Java an

Java Utility Klassen

Utility Java Klassen – was ist das? Man nennt diese auch Hilfsklassen von Java. Diese Utility Klassen sind Java Klassen, welche lediglich Methoden und Konstanten anbieten. Am Beispiel: Die Klasse Math ist so eine klassische Utility Klasse. Wozu braucht man solche Klassen? Diese Klassen sind so etwas wie ein Werkzeugkoffer für jedes Java Programm. Hier […]

Der Aufbau von Java Klassen

Java Klassen Aufbau

Jedes Java Programm besteht aus Java Klassen. Doch wie sind diese aufgebaut? Wie setzt sich die Struktur zusammen? Wo befinden sich Klassen hierarchisch? Was kommt in die Klassen rein und wie wird es integriert? Das sind die Fragen, welche ich in diesem Artikel beantworten werde. Doch bevor wir bei den Klassen ansetzen, müssen wir eine […]

Warum Java Kommentare immer ein Mittel der Kommunikation sind

Java Kommentare Kommunikation

Kennst Du die Bücherreihe „Miteinander reden“ von Schulz von Thun? Falls Du an der Uni warst oder bist, gehört dieses Buch zur Standardlektüre im Fach Schlüsselkompetenz. Denn ein Java Entwickler, welcher im Team arbeitet, muss klar und deutlich kommunizieren können. Und klar und deutlich heißt nicht, dass die Aussprache Deiner Worte verständlich sein soll. Nein […]

So nutzt du Methoden aus der Java String Klasse

Java Strings Methoden

In einen der letzten Beiträge haben wir darüber gesprochen, dass Java Strings – Objekte sind. Dass Strings in allen Programmen äußerst häufig vorkommen Und dass sich deshalb Referenzvariablen String-Objekte im String Pool teilen. Das Konzept hinter dem String-Pool ist die Teilung der Ressourcen. Und das bedeutet: Weniger Objekte – mehr Speicher Mehr Speicher – bessere […]

So lassen sich Java Arrays kopieren

Java Arrays kopieren

Java Arrays kopieren oder klonen…. Was heißt das eigentlich? Eine Kopie ist eine Reproduktion bzw. die Nachbildung eines Originals. Somit ist jede Fotographie – die Abbildung einer bestimmten optischen Wirklichkeit, zu einem festen Zeitpunkt. Die Kopie einer Buchseite ist das optische Abbild dieser spezifischen Buchseite – auch zu einem festen Zeitpunkt. Wichtig in diesem Zusammenhang […]

Über das kurze Leben einer lokalen Variablen

Java Variable lokal

Lass uns über die Lebensdauer einer lokalen Variablen sprechen. Warum ausgerechnet die Lebensdauer? Alle Java Variablen, unterscheiden sich in folgenden Punkten: wo diese deklariert werden können, wie du diese aufrufen kannst, welchen Bereich diese abdecken, und Ihre Lebensdauer Und eine lokale Java Variable hat eine relativ kurze Lebensdauer. Schauen wir uns zuerst Klassen- und Instanzvariablen […]