Java for-Schleifen dynamisch ineinander schachteln

nintendoluk

Commander
Dabei seit
Mai 2014
Beiträge
2.123
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
 

nintendoluk

Commander
Ersteller dieses Themas
Dabei seit
Mai 2014
Beiträge
2.123
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)

blöderidiot

Captain
Dabei seit
Juni 2004
Beiträge
3.294

nintendoluk

Commander
Ersteller dieses Themas
Dabei seit
Mai 2014
Beiträge
2.123

max40

Ensign
Dabei seit
Nov. 2010
Beiträge
211
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
		
	}
}
 

r34ln00b

Lieutenant
Dabei seit
Feb. 2006
Beiträge
1.017
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.
 

nintendoluk

Commander
Ersteller dieses Themas
Dabei seit
Mai 2014
Beiträge
2.123
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?
 

max40

Ensign
Dabei seit
Nov. 2010
Beiträge
211
was ist den dann nachher das Ziel? mir fehlt die vorstellungskraft wozu man sowas benötigt was du vorhast.
 

nintendoluk

Commander
Ersteller dieses Themas
Dabei seit
Mai 2014
Beiträge
2.123
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...
 

r34ln00b

Lieutenant
Dabei seit
Feb. 2006
Beiträge
1.017
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.
 
Top