Alle Kombinationen von "0000" bis "FFFF" kompakt schrieben

_user_q

Aktives Mitglied
Ich habe folgenden Code (erst mal nur bis FFFF):
Java:
static String[] letters = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};

    public static void main(String[] args) throws IOException {
        for (String first : letters) {
            for (String second : letters) {
                for (String third : letters) {
                    for (String fourth : letters) {

                        String sequence = first + second + third + fourth;
                        System.out.print(sequence);
                    }
                }
            }
        }
    }
Damit kann ich mir zwar alle Kombinationen ausgeben lassen, aber ich müsste für jede neue Stelle eine weitere for-loop erstellen, z. B. wenn es 10 Stellen haben soll.
Wie kann ich das kürzer schreiben und noch zusätzlich angeben, wie viele Stellen ich mit allen Kombinationen haben möchte?
 

KonradN

Super-Moderator
Mitarbeiter
Das ist eine einfache Hexadezimale Zahl - es reicht also eine Schleife mit Ausgabe als Hexadezimal-Zahl:

Java:
        for (int zahl = 1; zahl <= 0xff ; zahl++)
            System.out.println(String.format("%2X", zahl));

Das ist jetzt für zwei Stellen - du kannst aber die Schleife anpassen und bei der Formatierung die %2x zu %4x oder so ändern.
 

_user_q

Aktives Mitglied
Das ist eine einfache Hexadezimale Zahl - es reicht also eine Schleife mit Ausgabe als Hexadezimal-Zahl:

Java:
        for (int zahl = 1; zahl <= 0xff ; zahl++)
            System.out.println(String.format("%2X", zahl));

Das ist jetzt für zwei Stellen - du kannst aber die Schleife anpassen und bei der Formatierung die %2x zu %4x oder so ändern.
Erst mal danke, aber wie ist sieht es denn bei Strings aus? Das war in meinem Beispiel ausgerechnet Hexadecimal.
Zum Beispiel: "0000" bis "ZZZZZZZZZZZZ"
Mindestlänge 4, Maximallänge 12
 

Robert Zenz

Top Contributor

KonradN

Super-Moderator
Mitarbeiter
Als zusätzlicher Hinweis: Du hast ja dann eine Zahl, die Du in einem bestimmten Zahlensystem darstellen willst. Wenn Du statt 10 oder 16 dann von mir aus 36 mögliche Ziffern hast, dann hast Du eine einfache Umwandlung einer Zahl in das "36er System". Damit kann man sich ja anschauen, wie man sowas rechnerisch durchführen kann.
 

_user_q

Aktives Mitglied
Als zusätzlicher Hinweis: Du hast ja dann eine Zahl, die Du in einem bestimmten Zahlensystem darstellen willst. Wenn Du statt 10 oder 16 dann von mir aus 36 mögliche Ziffern hast, dann hast Du eine einfache Umwandlung einer Zahl in das "36er System". Damit kann man sich ja anschauen, wie man sowas rechnerisch durchführen kann.
Ich habe folgende Methode gefunden, musste sie mir aber lange anschauen:
Java:
for (int length = minLength; length < maxLength + 1; length++) {
            generate("", length);
}

        static void generate(String str, int length) {
        if (length == 0) {
            System.out.println(str);
        } else {
            for (char c : charset) {
                generate(str + c, length - 1);
        }
        }
        }
Trotzdem danke.
 

Neumi5694

Top Contributor
Hexadezimal ist einfach.
Für einen beliebigen Wertebereich (auch mit Lücken und nicht mit fortlaufenden Zeichen) wäre der klassische manuelle Ansatz (ohne vorgefertigte Funktionen) eine rekursive Methode mit Zähler. Bei jedem rekursiven Aufruf wird der Zähler verringert, bis er 0 erreicht hat. Rückgabewet wäre jeweils eine Liste von Strings.
 

_user_q

Aktives Mitglied
Hexadezimal ist einfach.
Für einen beliebigen Wertebereich (auch mit Lücken und nicht mit fortlaufenden Zeichen) wäre der klassische manuelle Ansatz (ohne vorgefertigte Funktionen) eine rekursive Methode mit Zähler. Bei jedem rekursiven Aufruf wird der Zähler verringert, bis er 0 erreicht hat. Rückgabewet wäre jeweils eine Liste von Strings.
Ich habe noch eingebaut, dass die Kombinationen in eine Datei geschrieben werden sollen. Jedoch besteht das Problem, dass z. B. für "0000" bis "FFFF" nur dann alle Kombinationen in die Datei geschrieben werden, wenn ich explizit ein Maximum für die Kombinationen festlege (bspw. max. 65.536 Kombinationen, was ja eigentlich auch ohne Angabe rauskommen sollte, tut es aber nicht).
Java:
            if (outputToFile) {
                writer.write(before + str + after + "\n");
            }

            if (printInConsole) {
                System.out.println(before + str + after);
            }
Liegt das irgendwie an FileWriter? Denn in der Konsole werden alle Kombinationen ausgegeben ...
 

KonradN

Super-Moderator
Mitarbeiter
Wobei diese verschachtelten Schleifen / rekursive Aufrufe so nicht benötigt werden.

Eine einfache Zählschleife reicht aus. Und zu Darstellung kann man eine Schleife schreiben, die halt:
a) die aktuelle Ziffer mit % AnzahlZiffern
b) den Rest mit / AnzahlZiffern berechnet.
Und das so lange, bis der Rest 0 ist.

Das ist ganze Problem lässt sich also in zwei einfache Teilprobleme unterteilen:
1. Ein einfacher Zähler
2. Eine Darstellung einer Zahl.
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe noch eingebaut, dass die Kombinationen in eine Datei geschrieben werden sollen. Jedoch besteht das Problem, dass z. B. für "0000" bis "FFFF" nur dann alle Kombinationen in die Datei geschrieben werden, wenn ich explizit ein Maximum für die Kombinationen festlege (bspw. max. 65.536 Kombinationen, was ja eigentlich auch ohne Angabe rauskommen sollte, tut es aber nicht).
Java:
            if (outputToFile) {
                writer.write(before + str + after + "\n");
            }

            if (printInConsole) {
                System.out.println(before + str + after);
            }
Liegt das irgendwie an FileWriter? Denn in der Konsole werden alle Kombinationen ausgegeben ...
Die Problematik verstehe ich jetzt gerade nicht. Was ist denn die genaue Fehlersituation?

Und Du brauchst nicht ständig diese Abfragen. System.out ist ein PrintWriter und wenn Du bei der Datei auch einen Writer hast, dann kannst Du einfach etwas schreiben wie:
Java:
try (Writer writer = getWriter()) {
    // Dein Code mit eben dem Writer!
}




// ...
private writer getWriter() {
    if (writeToConsole) return System.out;
    if (writeToFile) return new FileWriter(....);
    throw new IllegalStateException("No Output defined");
}

Wichtig ist halt auch, dass so Dinge sauber geschlossen werden und da bietet sich in der Regel ein try with resources an. Hier evtl. nicht so gut, da Du System.out nicht schließen willst :)
 

_user_q

Aktives Mitglied
Die Problematik verstehe ich jetzt gerade nicht. Was ist denn die genaue Fehlersituation?

Und Du brauchst nicht ständig diese Abfragen. System.out ist ein PrintWriter und wenn Du bei der Datei auch einen Writer hast, dann kannst Du einfach etwas schreiben wie:
Java:
try (Writer writer = getWriter()) {
    // Dein Code mit eben dem Writer!
}




// ...
private writer getWriter() {
    if (writeToConsole) return System.out;
    if (writeToFile) return new FileWriter(....);
    throw new IllegalStateException("No Output defined");
}

Wichtig ist halt auch, dass so Dinge sauber geschlossen werden und da bietet sich in der Regel ein try with resources an. Hier evtl. nicht so gut, da Du System.out nicht schließen willst :)
Wenn ich die getWriter()-Methode in Verwendung ziehen würde, würde sich IntelliJ um FileWriter und PrintStream streiten.

Jedoch funktioniert es jetzt wieder ... plötzlich. Ich habe einfach
Java:
fileWriter.flush();
fileWriter.close();
an eine andere Stelle gepackt, wobei sie eigentlich immer noch im selben Moment ausgeführt wird.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn ich die getWriter()-Methode in Verwendung ziehen würde, würde sich IntelliJ um FileWriter und PrintStream streiten
Ja, System.our ist ein PrintStream - wenn man Code im Forum schreibt, dann passieren so Fehler.

Dann macht man halt
return new OutputStreamWriter(System.out);

=> sprich einfach einen Writer auf dem Stream erzeugen.
 

_user_q

Aktives Mitglied
Ja, System.our ist ein PrintStream - wenn man Code im Forum schreibt, dann passieren so Fehler.

Dann macht man halt
return new OutputStreamWriter(System.out);

=> sprich einfach einen Writer auf dem Stream erzeugen.
wenn man Code im Forum schreibt, dann passieren so Fehler.
Alles gut :D
Ich habe deinen Code in meinen einbinden können, aber der ist um viele viele Sekunden langsamer, wenn der 65.536 Kombinationen generieren soll.
 

berndoa

Top Contributor
Das ist zwar für deinen Fall vermutlich viel zu overkill und auch für solch kleine Zahlen zu ineffizient.
Aber ich habe mir bei einer mathematischen Aufgabe, wo ich größenmässig an die Obergrenzen von int und long stieß (also sehr große Zahlen!)
mir meine eigenen Zahlen gebaut im Sinne eines Arrays bzw. einer ArrayList.
bspw. in einer eigenen Klasse
bspw. für eine 6stellige Zahl also ein
Java:
int[] number= new int[6];
erzeugt bei dem jedes Element für eine "Stelle/Ziffer" der Gesamtzahl steht.
Und diese Zahl anfangs auf das Kleinstmögliche initialisiert, in deinem Fall als "000000".

Dann in der Klasse noch eine Methode zum Erhöhen eingebaut, die folgendem Algorithmus folgt:

Code:
//gehe zur kleinsten stelle (ziffer ganz rechts, aka ziffer mit index=length-1)
//falls gleich maximalziffer, dann gehe eine ziffer nach links, (index=index-1)
//mache das bis entweder index<0 (dann ist die gesamtzahl bereits maximal)
//oder bis ziffer<maximalziffer gefunden.
//in letzterem fall setzt du diese aktuelle stelle um eins höher (also number[index]++)
//dann setzt du alle ziffern rechts von dieser gerade erhöhten stelle auf die minimalziffer
//fertig

//spiels einfahc mal bei dem übergang von der Zahl 008999 zu 009000 durch, da erkennst du das Prinzip

In Obigem Algorithmus bin ich vom zehnerbasissystem augegangen wo die ziffern bekanntlich von 0-9 gehen
und man ganz normal +1 rechnen kann zum "erhöhen".

wenn du sozusagen "custom" ziffern hast, macht es sinn die in einem array zu haben.
eine methode dazu die dir zu einer vorgegebenen Ziffer die "nächsthöhere" (also die mit nächsthöherem index) gibt.
eine methode (oder hardcoden) welches die minimalziffer bestimmt sowie die maximalziffer.

usw.



klingt sehr umständlich, ist es auch.

Aber so kann ich bspw. Zahlen mit 10^30 ziffern haben, wobei jede "ziffer" so ziemlich alles sein kann. kann was zwischen 0 und zzz sein.
oder was Anderes.

Frage ist nur ob der Computer durchhält wenn man solche Sachen macht.
Und garantiert lässt sich sowas performancemässig viel mehr optimieren, also bspw. mit char array arbeiten, usw.

Vermutlich viel zu umständlich gedacht, aber das wäre die noobmässigste Art das zu lösen.


In deinem Fall tuen es aber normale Hexadezimalzahlen, braucht es keine customklasse für ein eigens gebautes zahlenbasissystem.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MaxG. Best Practice Alle Kombinationen berechnen Allgemeine Java-Themen 3
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
F Java Spintax: Alle Kombinationen Erzeugen Allgemeine Java-Themen 2
P Methoden Alle Kombinationen aus 2 Karten berechnen Allgemeine Java-Themen 2
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
Spot84 alle kombinationen einer string arraylist Allgemeine Java-Themen 2
G Alle Möglichen Kombinationen einer Liste Allgemeine Java-Themen 11
M Alle möglichen Kombinationen von mehreren Objekten berechnen Allgemeine Java-Themen 6
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
L Farbverlauf RGB alle Farben Allgemeine Java-Themen 28
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
S Alle Dateinamen ermitteln Allgemeine Java-Themen 22
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
S Anwendung die alle Abhaengigkeiten einer Library listet..? Allgemeine Java-Themen 5
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
I Alle logs von Logger bekommen Allgemeine Java-Themen 3
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
L Alle möglichen Additionen (Rekursiv) Allgemeine Java-Themen 3
KaffeeFan Methoden replace alle Buchstaben Allgemeine Java-Themen 3
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
Sogomn Klassen Alle in eine Klasse Allgemeine Java-Themen 11
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
M Zufälligen String generieren und alle 5 Minuten ändern Allgemeine Java-Themen 2
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
C SwingWorker.cancle(true) tötet alle Worker Allgemeine Java-Themen 3
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
T Alle Instancen einer Klasse auflisten Allgemeine Java-Themen 13
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
brunothg Alle Kombiationen von n Ziffern Allgemeine Java-Themen 2
M Erste Schritte alle xmlFiles in zugehörige pdfFiles einlesen Allgemeine Java-Themen 4
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
E Logger loggt nicht alle Level Allgemeine Java-Themen 2
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K String: alle X Zeichen Zeilenumbruch Allgemeine Java-Themen 3
F Alle Exceptions abfangen Allgemeine Java-Themen 4
nrg JS als ScriptEngine - alle Punkte ersetzen Allgemeine Java-Themen 4
A Bildschirmauflösung geändert - alle Bildschirminhalte verschoben - was tun? Allgemeine Java-Themen 7
C Alle Klassen eines Packages lesen und instanzieren? Allgemeine Java-Themen 9
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
S Warum packt er nicht alle Dateien? Allgemeine Java-Themen 13
J Alle Tage eines Jahres Allgemeine Java-Themen 2
AlexSpritze Alle Domains oder FQDN von einem Server erfragen? Allgemeine Java-Themen 2
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
J Konstrukt um alle Paare und Tripel einer Punkte-Menge bilden Allgemeine Java-Themen 12
B Alle möglichen Buchstabenkombinationen in einem String Allgemeine Java-Themen 7
P alle zusammanhaengenden teilgraphen Allgemeine Java-Themen 7
A alle nicht-dplikate finden Allgemeine Java-Themen 14
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
E Alle unter Prozesse der beim schließen mit schließen Allgemeine Java-Themen 3
A An alle Cracks: Anwendung beenden mit ShutdownHook? Allgemeine Java-Themen 13
J Logger gibt nicht alle Level aus Allgemeine Java-Themen 3
M alle möglichen Zahlenkombinationen Allgemeine Java-Themen 5
B in welchem verzeichnis liegen alle installierten klassen? Allgemeine Java-Themen 6
hdi Für alle fleissigen Helfer! Allgemeine Java-Themen 15
N Alle Fehler ausgeben? Allgemeine Java-Themen 4
J Zweiter Prozess der alle x Sekunden etwas abfragen soll Allgemeine Java-Themen 2
O Auf alle Events reagieren Allgemeine Java-Themen 3
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
U alle Dateien eines Ordners innerhalb einer JAR auflisten Allgemeine Java-Themen 6
S toString() für alle Member einer Klasse. Allgemeine Java-Themen 6
G Alle möglichen Konfigurationen eines Baumes Allgemeine Java-Themen 4
C Alle Möglichen Substrings der Länge k aus String extrahieren Allgemeine Java-Themen 9
C Alle Bilder eines binären Arrays ausgeben Allgemeine Java-Themen 3
G Alle möglichen Permutationen einer Folge n Allgemeine Java-Themen 3
V Alle Klassen eines Package auflisten? Allgemeine Java-Themen 6
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
@ RegEx: Alle Sonderzeichen ausser dem Punkt Allgemeine Java-Themen 4
H Alle möglichen Hochkommata ausschließen Allgemeine Java-Themen 6
M Gibt es ein Jar - das alle Componente Automatisch anpasst? Allgemeine Java-Themen 14
K Suche alle Objekte einer bestimmten Klasse Allgemeine Java-Themen 2
N Unter Mac Os X alle laufenden Prozesse ausgeben Allgemeine Java-Themen 3
S Änderung an Proberties datei an alle User weitergeben? Allgemeine Java-Themen 7
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
der JoJo [TreeSelection] wie bekomme ich alle Elemente Allgemeine Java-Themen 4
G Alle Zeichen des Alphabets ausgeben Allgemeine Java-Themen 4
G Alle Möglichkeiten n Elemente Anzuordnen. Allgemeine Java-Themen 13
0 Alle Teiler einer Zahl performant berechnen? Allgemeine Java-Themen 9
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
O Warten bis alle gestarteten Threads beendet sind? Allgemeine Java-Themen 6
G HTML file Alle relativen URL in absolute URL umschreiben? Allgemeine Java-Themen 12

Ähnliche Java Themen


Oben