Viele verschachtelte Schleifen

Status
Nicht offen für weitere Antworten.

minimammut

Mitglied
Hallo allerseits,
ich habe ein Problem, dass ich sehr viele (8) gleichartige Schleifen ineinander geschachtelt habe. Das sieht ungefähr so aus:
Java:
...
for(int c=0;c<27;c++){
  z[6]=c;
  for(int b=0;b<27;b++){
    z[7]=b;
    for(int a =0;a<27;a++){
      z[8]=a;
      zahlen.add(z);
    }
  }
}
...
Was ich machen will ist sozusagen hochzählen zur Basis 26.
Das müsste ja auch so funktionieren, nur dachte ich mir, dass es doch nicht wahr sein kann, dass man 8 mal fast das gleiche schreiben muss. Gibt es für das Problem eine deutlich bessere Lösung?
Und allgemein, gibt es etwas, mit dem man einfach geschachtelte Schleifen leichter angeben kann, sozusagen eine "Potenzschleife?".
Eine rekursive Lösung hab ich auch schon geschrieben, ab 6 Stellen reichte jedoch leider der Speicher nicht.
Freue mich über alle Anregungen,
Gruß minimammut
 

0x7F800000

Top Contributor
Was ich machen will ist sozusagen hochzählen zur Basis 26.
Das problem ist mir nicht klar. Was soll das bedeuten "zur Basis hochzählen"? Man kann entweder zählen ( =bijektive Abbildung zur menge der natürlichen Zahlen angeben) oder eine natürliche Zahl bezüglich einer Basis darstellen (praktisch zeichenkette hinschreiben)

Was willst du denn? Irgendwelche Kombinationen einer 27-elementigen Menge durchprobieren? Ist dir bewusst, dass da zwölfstellige Zahlen rauskommen können?
 

minimammut

Mitglied
ich möchte dass ich am ende alle höchstens acht stelligen Zahlen im "26er System" gesammelt habe. Also 0 0 0 0 0 0 0 0 bis 26 26 26 26 26 26 26 26
 

faetzminator

Gesperrter Benutzer
Und warum machst du da nicht nur eine Schleife? Ist mathematisch ein Bisschen komplexer aber sollte sogar lesbarer sein.
 

Marco13

Top Contributor
Jup, da isses wieder ;)

Diesmal? Passwortcracken :)

Am einfachsten ist das rekursiv:
Code:
public boolean increase(int array[], int index, int maxValue)
{
    if (index==-1) return false;
    if (array[index]==maxValue)
    {
        array[index] = 0;
        increase(array, index-1, maxValue);
    }
    else
    {
        array[index]++;
    }
    return true;
}
Aufruf mit
[c]
increase(array, array.length-1, 26);
[/c]

Immer denselben Array zu "zahlen" hinzuzufügen ist übrigens witzlos.
[c]
zahlen.add(z.clone());
[/c]
wäre vermutlich sinnvoller. Wobei du dafür nicht genug RAM haben dürftest. Aber das nur nebenbei.
 

0x7F800000

Top Contributor
ich möchte dass ich am ende alle höchstens acht stelligen Zahlen im "26er System" gesammelt habe. Also 0 0 0 0 0 0 0 0 bis 26 26 26 26 26 26 26 26
Geht nicht. Hier war neulich einer, wollte auch Milliarde von Milliarden int-Arrays anlegen. Ich habe kurz nachgerechnet: dazu bräuchte er einen 20x20x20 Meter großen würfel aus den teuersten festplatten, die es momentan auf dem markt gibt. In deinem Fall wäre das "nur" ein 20x20x5 meter großer Quader^^
Mach das was Marco13 ungefähr skizziert hat, aber denk nicht mal dran, diesen Kram abzuspeichern, das brauchst du nicht mal, wenn es tatsächlich um Passwörter geht.

Und nur so nebenbei: du rechnest im 27'er system...
 

Shulyn

Bekanntes Mitglied
ich möchte dass ich am ende alle höchstens acht stelligen Zahlen im "26er System" gesammelt habe. Also 0 0 0 0 0 0 0 0 bis 26 26 26 26 26 26 26 26


2417851639229258349412352 x 8 stellen im Array Speichern :shock:


// ich geh mir erstmal einen Kaffee zapfen


OK wieder da, was meinst du mit "gesammelt habe" ? Sie wirklich zu Speichern ??
 
Zuletzt bearbeitet:

moormaster

Top Contributor
Ich würde sowas nicht iterativ mit verschachtelten Schleifen lösen und rekursiv schon gar nicht.

Ich würde die aktuelle Zahl einfach in einem Array bestehend aus 8 Elementen (die Zahl soll ja aus 8 Stellen bestehen) speichern und mir dann eine Funktion bauen, welche mir zu einer solchen Zahl den Nachfolger ausrechnet:

Java:
 public class Number
 {
  int base;

  // value[0] * base^0 + value[1] * base^1 + ...
  int[] value;

  public Number(int base, int length)
  {
   this.base = base;
   this.value = new int[length];
  }

 /*
  * returns true if overflow occured, false otherwise
  */
  public boolean calculateSuccessor()
  {
   int pos=0;
   boolean overflow = true;

   while (overflow && pos < value.length)
   {
    if (value[pos] < base-1)
     overflow = false;

    value[pos] = (value[pos] + 1)%base;
    pos++;
   }

   return overflow;
  }

  // ...
 }

Jetzt kannst du in einer einzelnen while Schleife immer calculateSuccessor() aufrufen und anhand des overflows erkennen, wann es wieder bei 0 0 0 ... losgeht :D
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
@moormaster: funktioniert es überhaupt, wenn ja: wie? hab's eben nicht hingekriegt... Eigene klassen nach den allergrundlegendsten Klassen der Core API zu benennen trägt jedenfalls nicht zur Übersicht bei.

@OP:
Für allgemeine Kombinationen von Elementen beliebiger endlicher Mengen kann man sowas benutzen:
Java:
//combinations as iterable
public static <T> Iterable<List<T>> getCombinations(final Collection<T> c, final int length){
	return new Iterable<List<T>>(){
		
		@Override
		public Iterator<List<T>> iterator() {
			
			return new Iterator<List<T>>(){
				private ArrayList<Iterator<T>> digitIterators=new ArrayList<Iterator<T>>(length);
				private ArrayList<T> next=new ArrayList<T>(length);
				boolean hasNext=c.size()>0 && length>0;
				{
					for(int i=0; i<length; i++){
						digitIterators.add(c.iterator());
						next.add(digitIterators.get(i).next());
					}
				}
				
				private boolean calculateNext(int digit){
					if(digit==length){
						return false;
					}else if(digitIterators.get(digit).hasNext()){
						next.set(digit,digitIterators.get(digit).next());
						return true;
					}else{
						digitIterators.set(digit,c.iterator());
						next.set(digit,digitIterators.get(digit).next());
						return calculateNext(digit+1);
					}
				}
				
				@Override
				public boolean hasNext(){
					return hasNext;
				}
				
				@Override
				public List<T> next(){
					List<T> temp=new ArrayList<T>(next);
					hasNext=calculateNext(0);
					return temp;
				}
				
				@Override
				public void remove(){
					throw new UnsupportedOperationException("w'the fuck?");
				}
			};
		}
	};
}

Beispiel:
Java:
Collection<Character> c=new LinkedList<Character>();
for(char x='0'; x<='9'; x++){
	c.add(x);
}

for(List<Character> combi:getCombinations(c,3)){
	System.out.println(combi);
}
Kannst dich natürlich davon (oder von Marco13's kürzeren version) inspirieren lassen, um dasselbe speziell für integer-arrays zu schreiben.
 

moormaster

Top Contributor
@moormaster: funktioniert es überhaupt, wenn ja: wie? hab's eben nicht hingekriegt... Eigene klassen nach den allergrundlegendsten Klassen der Core API zu benennen trägt jedenfalls nicht zur Übersicht bei.

Dann nenn sie halt anders... ob dieses Beispiel funktioniert, weiss ich nicht; habs nicht compiliert :D Aber das Prinzip funktioniert auf jeden Fall... Addition mit Übertrag; mehr ist das nicht, was ich dort gemacht hab.
 

Ariol

Top Contributor
Warum denn so kompliziert? Es soll doc nur gezählt werden:

Java:
import java.awt.Container;
import java.util.ArrayList;
import java.util.Arrays;

public class Main
{
	private static int	employeeCount;


	static ArrayList<String> stringZahlen = new ArrayList<String>();
	static ArrayList<int[]> zahlen = new ArrayList<int[]>();
	
	public static void main(String[] args)
	{
		int positions = 2;
		for(long i = 0; i < Math.pow(26, positions); i++)
		{
			stringZahlen.add(Long.toString(i, 26));
		}
		
		for(String zahl: stringZahlen)
		{
			int[] zArray = new int[zahl.length()];
			for(int i = 0; i < zahl.length(); i++)
			{
				char c = zahl.charAt(i);
				int val = c<0x3a?c-0x30:c-0x61+10; //convert from ascii
				zArray[i] = val; 
			}
			zahlen.add(zArray);
		}
		
		for(int[] zahl : zahlen)
		{
			for(int i = 0; i < zahl.length; i++)
			{
				System.out.print(zahl[i] + "\t");
			}
			System.out.println();
		}
		
	}
}import java.awt.Container;
import java.util.ArrayList;
import java.util.Arrays;

public class Main
{
	private static int	employeeCount;


	static ArrayList<String> stringZahlen = new ArrayList<String>();
	static ArrayList<int[]> zahlen = new ArrayList<int[]>();
	
	public static void main(String[] args)
	{
		int positions = 2;
		for(long i = 0; i < Math.pow(26, positions); i++)
		{
			stringZahlen.add(Long.toString(i, 26));
		}
		
		for(String zahl: stringZahlen)
		{
			int[] zArray = new int[zahl.length()];
			for(int i = 0; i < zahl.length(); i++)
			{
				char c = zahl.charAt(i);
				int val = c<0x3a?c-0x30:c-0x61+10; //convert from ascii
				zArray[i] = val; 
			}
			zahlen.add(zArray);
		}
		
		for(int[] zahl : zahlen)
		{
			for(int i = 0; i < zahl.length; i++)
			{
				System.out.print(zahl[i] + "\t");
			}
			System.out.println();
		}
		
	}
}

Und da ist ne Menge Overhead bei.
 

0x7F800000

Top Contributor
Und da ist ne Menge Overhead bei.
und alles doppelt gibt's ganz umsonst? :bahnhof:

Ich weiß jedenfalls nicht, was du da gemacht hast, aber für solche Stunts:
Java:
        for(long i = 0; i < Math.pow(26, positions); i++)
        {
            stringZahlen.add(Long.toString(i, 26));
        }
...benötigt man eben 20x20x5 meter quader aus Festplatten.
 
Zuletzt bearbeitet:

Ariol

Top Contributor
und alles doppelt gibt's ganz umsonst? :bahnhof:

Ich weiß jedenfalls nicht, was du da gemacht hast, aber für solche Stunts:
Java:
        for(long i = 0; i < Math.pow(26, positions); i++)
        {
            stringZahlen.add(Long.toString(i, 26));
        }
...benötigt man eben 20x20x5 meter quader aus Festplatten.

Jop, aber das war doch nicht die Aufgabenstellung, oder?
minimammut will für eine bestimmte Anzahl an stellen alle möglichen Kombinationen von Zahlen zwischen 1 und 26. Das es dabei bei 9 Stellen (wie in seinem Beispiel-Code) 5429503678976 verschiedene Kombinationen gibt, und diese wohl etwas zu viel für seinen Speicher sind ist etwas anderes, dass er irgendwie sonst lösen muss:
Er benötigt mindestens 5Bit (26 verschiedene Zeichen) pro Position x 9 Positionen = 45Bit; 45bit x 5429503678976 Kombinationen = ca. 27,776839665 TB
Da aber dabei noch Dinge wie die Verwaltung der Daten fehlen und es keinen 5bit-Datentyp gibt wird es wohl doch eher das doppelte an Speicher werden.

Warum die Daten überhaupt gespeichert werden sollen ist auch nicht klar.

P.S.: so groß wird der Quader dann wohl doch nicht :wink:
 

0x7F800000

Top Contributor
ca. 27,776839665 TB
Öööhm njum njam... :reflect:
Okay, deine schätzung sieht besser aus. Bei dieser Milliarde von milliarden Int-Array hab ich aber für eine preisgünstigere Lösung mit 80GB festplatten einen 30x30x30 meter würfel rausgekriegt... Kann auch sein, dass ich mich irgendwo verrechnet hab... :oops:

50 TB passt jedenfalls nicht in den RAM. Und dass der OP Problem mit speicher hat, steht ja gleich im ersten Beitrag:
Eine rekursive Lösung hab ich auch schon geschrieben, ab 6 Stellen reichte jedoch leider der Speicher nicht.
Wenn er alles gleichzeitig im speicher haben will, bräuchte er also etwa 20000 mal soviel speicher. Das geht nicht. Die Lösung a' la Marco13 mit Iterables geht aber, weil dort die Kombinationen nicht im Raum, sondern in Zeit gespeichert werden. Zeit ist in diesem fall wesentlich billiger als Speicher.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
s_1895 zu viele Zeilen in der Main Methode Java Basics - Anfänger-Themen 4
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
P Nutzer entscheiden lassen, wie viele Zahlen dieser in ein Array eingeben möchte. Java Basics - Anfänger-Themen 6
S Hilfe : Unendlich viele Zufallszahlen erstellen? Java Basics - Anfänger-Themen 8
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
T Variablen Beliebig viele Arrays in Schleife erstellen Java Basics - Anfänger-Themen 1
M Aufgabe: Eine Klasse und viele Untermethoden Java Basics - Anfänger-Themen 30
D Klassen Doppelt so viele Elemente in Arraylist ? Java Basics - Anfänger-Themen 4
D zu viele MySQL Connections Java Basics - Anfänger-Themen 18
F Threads ftp4j, viele Dateien upload Java Basics - Anfänger-Themen 5
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
D Viele grafische unterschiede von Windows xp zu Windows 7 Java Basics - Anfänger-Themen 3
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
T Zu viele Fenster - HILFE! Java Basics - Anfänger-Themen 5
Prafy Beliebig viele Arrays erstellen? Java Basics - Anfänger-Themen 2
J Methoden Beliebig viele Objekt-Eingabeparameter im Konstruktor Java Basics - Anfänger-Themen 6
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
M Zu viele Verkettungen von Klassen Java Basics - Anfänger-Themen 4
G Erste Schritte Wie viele Montage gab es? Java Basics - Anfänger-Themen 14
M Input/Output Viele short aus Datei lesen und von Little Endian zu Big Endian umwandeln Java Basics - Anfänger-Themen 12
S Variablen viele Instanzvariablen vermeiden Java Basics - Anfänger-Themen 14
El_Lobo Methoden Zu viele Getter- und Settermethoden - geht das einfacher? Java Basics - Anfänger-Themen 3
L buffered reader produziert zu viele und seltsame zeichen Java Basics - Anfänger-Themen 2
D Erste Schritte Viele Objekte einer Klasse "verwalten" Java Basics - Anfänger-Themen 17
T Beliebig viele Werte in Array zwischenspeichern Java Basics - Anfänger-Themen 15
S Viele Fragen von einem Anfänger in Java Java Basics - Anfänger-Themen 2
F Viele Controller-Klassen Java Basics - Anfänger-Themen 5
P Datentypen extrem viele Fehler nur irgendwie seh ich den Grund ned... Java Basics - Anfänger-Themen 3
M Viele GUI-Variablen Java Basics - Anfänger-Themen 4
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
U JTable viele möglichkeiten, keine Lösung Java Basics - Anfänger-Themen 5
H Reflexion: Eine Methode, beliebig viele Parameter (Java 1.4.2) Java Basics - Anfänger-Themen 8
Avalarion Erschaffung eines Shadowrun Charaktergenerators - Viele, Viele Fragen! Java Basics - Anfänger-Themen 6
S Viele Konstanten, EnumSet? Java Basics - Anfänger-Themen 3
S Stilfrage: Neue Klasse wenn es in einer Klasse zu viele Methoden gibt? Java Basics - Anfänger-Themen 14
Kasu So viele "_ " ausgeben, wie ein String lang ist Java Basics - Anfänger-Themen 4
I viele Dateinamen in ein String-Array mit File().list() Java Basics - Anfänger-Themen 4
mwildam Textfile lesen und schreiben - so viele Möglichkeiten Java Basics - Anfänger-Themen 5
U Zu viele werte in einer klasse Java Basics - Anfänger-Themen 4
K Viele Fragen eines Anfängers-Fließkommazahlen/Typenwandlung Java Basics - Anfänger-Themen 5
W Viele Objekte mit einem Konstrukor erzeugen Java Basics - Anfänger-Themen 10
R einfaches Programm, viele Probleme Java Basics - Anfänger-Themen 29
G viele zahlen mit wenig code Java Basics - Anfänger-Themen 4
X 1 MySQL-Verbindung und viele Threads Java Basics - Anfänger-Themen 4
E Viele Fragen Java Basics - Anfänger-Themen 8
J viele Objekte erzeugen Java Basics - Anfänger-Themen 21
J Große *.Text Datei zum verschicken in viele kleine Java Basics - Anfänger-Themen 7
O viele Name mit jeweils zugehörigen Status in .txt Speichern Java Basics - Anfänger-Themen 16
K ResultSet: Wie viele Rows beinhaltet es? Java Basics - Anfänger-Themen 6
X Viele Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 2
C zu viele paint()'s. Java Basics - Anfänger-Themen 6
M Viele Textfelder auslesen Java Basics - Anfänger-Themen 3
P x-viele Variablen anlegen Java Basics - Anfänger-Themen 2
F Mit der Zahl n n-viele Arrays erstellen ?! Java Basics - Anfänger-Themen 4
S Verschachtelte for-Schleife Java Basics - Anfänger-Themen 2
laxla123 Verschachtelte If-Else Schleife Java Basics - Anfänger-Themen 21
W Verschachtelte If-else --> finde meinen Fehler nicht Java Basics - Anfänger-Themen 30
Düsseldorf2002 Datentypen Verschachtelte LinkedList Java Basics - Anfänger-Themen 5
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
B Verschachtelte For Schleifen Java Basics - Anfänger-Themen 8
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
S Verschachtelte Schleife Java Basics - Anfänger-Themen 3
F Methoden Verschachtelte if else Methode Java Basics - Anfänger-Themen 10
Z Verschachtelte If-Bedingung Java Basics - Anfänger-Themen 6
Y Verschachtelte For-Schleife Java Basics - Anfänger-Themen 5
D verschachtelte Schleifen Java Basics - Anfänger-Themen 6
M Verschachtelte Forschleifen Java Basics - Anfänger-Themen 2
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J static verschachtelte Klassen und innere Klassen Java Basics - Anfänger-Themen 1
TheMenox Verschachtelte If Bedingung Java Basics - Anfänger-Themen 4
R Verschachtelte Arraylist und deren Größe auslesen Java Basics - Anfänger-Themen 7
C Verschachtelte Map auslesen Java Basics - Anfänger-Themen 4
H Best Practice Wie mit break verschachtelte Schleifen komplett verlassen? Java Basics - Anfänger-Themen 2
F Verschachtelte Schleifen Java Basics - Anfänger-Themen 4
J Hilfe verschachtelte Schleifen Java Basics - Anfänger-Themen 5
F Erste Schritte Switch case vs. Verschachtelte If Anweisung Java Basics - Anfänger-Themen 11
G Collections verschachtelte ArrayList abfüllen Java Basics - Anfänger-Themen 5
X verschachtelte suche Java Basics - Anfänger-Themen 8
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
D Verschachtelte Objekterzeugung Java Basics - Anfänger-Themen 6
S verschachtelte for-Schleife Java Basics - Anfänger-Themen 6
X Verschachtelte Annotationen Java Basics - Anfänger-Themen 9
J verschachtelte Schleife Java Basics - Anfänger-Themen 10
P Verschachtelte Schleife vorzeitig abbrechen. Java Basics - Anfänger-Themen 50
S verschachtelte for Schleife und Ergebniss. Java Basics - Anfänger-Themen 3
J verschachtelte for-schleifen Java Basics - Anfänger-Themen 2
S Verschachtelte Klassen Java Basics - Anfänger-Themen 12
D Verschachtelte IF-Anweisung Java Basics - Anfänger-Themen 10
C Verschachtelte for-schleifen Java Basics - Anfänger-Themen 10
C Verschachtelte For-Schleifen Java Basics - Anfänger-Themen 5
3 Verschachtelte Zuweisung Java Basics - Anfänger-Themen 4
M Tief verschachtelte Packages Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben