Java for-Schleifen dynamisch ineinander schachteln

nintendoluk

Commander
Registriert
Mai 2014
Beiträge
2.124
Hi zusammen,

ich suche nach einer Möglichkeit for-Schleifen dynamisch ineinander zu setzen.

Ich stelle mir das so vor:

Wir haben einen Array int[] aSchleifen

Wenn aSchleifen.length = 3 ist, sollte die dazugehörige Schleife so aussehen:

Code:
for(int a = 0; a < aSchleifen[0]; a++)
{
	for(int b = 0; b < aSchleifen[1]; b++)
	{
		for(int c = 0; c < aSchleifen[2]; c++)
		{
			
		}
	}
}

oder wenn aSchleifen.length = 5 gilt, dann so:

Code:
for(int a = 0; a < aSchleifen[0]; a++)
{
	for(int b = 0; b < aSchleifen[1]; b++)
	{
		for(int c = 0; c < aSchleifen[2]; c++)
		{
			for(int d = 0; d < aSchleifen[3]; d++)
			{
				for(int e = 0; e < aSchleifen[4]; e++)
				{
					
				}
			}
		}
	}
}

aSchleifen.length soll natürlich auch größer sein können (zB. 1000)

Leider habe ich keine Ahnung wie ich das anstellen soll, bzw. wie man sowas nennt, damit ich gescheit danach Googlen kann.

Danke & Gruß
Lukas
 
Du meinst etwa so?

Code:
	public static void startFor(int[] myArray)
	{
		rekursivFor(myArray.length, myArray, 0);
	}
	
	private static void rekursivFor(int iSchleifen, int[] myArray, int startAt)
	{
		for(int a = 0; a < myArray[startAt] || iSchleifen > 0; a++)
		{
			rekursivFor(iSchleifen - 1, myArray, startAt + 1);
		}
	}

Das könnte sogar gehen :->
 
Zuletzt bearbeitet: (kleinen Fehler ausgebessert)
Scythe1988 schrieb:
Rekursiv nennt man sowas.

Ja, aber um die Rekursion zu verstehen, muß man erst die Rekursion verstanden haben!
 
Dein Ansatz ist doch schon falsch, mehr als folgendes brauchst du nicht um alles durchzugehen:
Code:
int[] aSchleifen = new int[]{5,9,20,78,63};

// Geht aSchleifen durch
for (int a = 0; a < aSchleifen.length; a++) {
        for (int b = 0; b < aSchleifen[a]; b++) {
		
		// was auch immer hier gemacht werden soll
		
	}
}
 
blöderidiot schrieb:
Ja, aber um die Rekursion zu verstehen, muß man erst die Rekursion verstanden haben!

Das wäre von Vorteil, dass stimmt. Ich wollte dem TE nur das Stichwort geben, welches ihm gefehlt hat :) Das Rekursion nicht trivial ist, ist ein anderes Thema :)
 
Du kannst das natürlich rekursiv lösen.
Der Index zum Abbruch der Schleifen ist jeweils immer aus dem int Array entnehmbar und ist zudem jeweils um eins inkrementiert, was die Sache erleichtert.
Du könntest eine Methode erstellen, in der du den Index berechnest. Mit diesem Index rufst du eine weitere Methode auf, welche eben nur bis zu diesem Punkt läuft.

max40s Vorschlag ist ganz gut. Packt alles schön zusammen.
 
max40 schrieb:
Dein Ansatz ist doch schon falsch, mehr als folgendes brauchst du nicht um alles durchzugehen:
Code:
int[] aSchleifen = new int[]{5,9,20,78,63};

// Geht aSchleifen durch
for (int a = 0; a < aSchleifen.length; a++) {
        for (int b = 0; b < aSchleifen[a]; b++) {
		
		// was auch immer hier gemacht werden soll
		
	}
}

Glaube nicht dass das ist was ich brauche, weil dann sind die Schleifen ja hintereinander, sie sollen aber ineinander sein.


@ r34ln00b:

Bei deinem Ansatz blicke ich nicht ganz durch. Kannst du bitte ein kleines Beispiel schreiben?
 
was ist den dann nachher das Ziel? mir fehlt die vorstellungskraft wozu man sowas benötigt was du vorhast.
 
Es geht um einen Stundenplan.
Ein Fach kann an mehreren Positionen sein das Ergebnis soll eine ArrayList aus allen möglichen Zusammenstellungen von Stundenplänen sein.

Ich will über Brute Force alle möglichen Kombinationen durchgehen.

Dazu muss ich für jede mögliche Position für Englisch auch jede mögliche Position von Deutsch und dafür auch jede mögliche Position von Mathe, usw...
 
Nun sehe ich was du genau willst und mit "ineinander" meinst. Damit ist max40s Vorschlag etwas ungünstig.

Zum Problem:
Du brauchst eine Methode, die die "Arbeit" verrichtet. Diese läuft dem Wert entsprechend aus dem Index i im Array (int).
Dann brauchst du für die i-1 Instanz eine Methode, welche obigen Schritt ausführt. Die Anzahl enthält int[i-1].
Reicht dir das, um das restliche Konstrukt erstellen zu können? ;) Du braucht eine Methode, die die Arbeit macht und eine weitere Methode, die die rekursiven Aufrufe ausführt.
 
Zurück
Oben