Kurzes Java-Programm, das sich komisch verhält

X

Xulu200

Mitglied
Hallo!

Zuerst: Ich nutze IntelliJ IDEA 2020.1.1 Ultimate Edition.

Eigentlich wollte ich nur fix etwas schreiben, um damit ein Problem zu lösen. Bei dem Problem geht es um die Anzahl von Ziffernkombinationen unter bestimmten Eigenschaften. Die Details sind an der Stelle nicht relevant.

Bevor ich die Eigenschaften abfragen kann, benötige ich die n! Zahlenkombinationen, wenn ich alle n-stelligen Zahlen (jede Ziffer darf nur einmal vorkommen) als Listen innerhalb einer Menge haben möchte. Es muss nicht schön oder performant sein, sondern nur die Menge der Listen liefern.

Deshalb schrieb ich Folgendes:
Java:
import java.util.*;

public class main {
    public final static int c = 2;
    static HashSet<ArrayList<Integer>> set = new HashSet<ArrayList<Integer>>();

    public static void main(String args[]) {
        m(new ArrayList<>(), makeSet(c), c);
        System.out.println("SIZE:");
        System.out.println(set.size());
    }

    public static HashSet<Integer> makeSet(int maximum) {
        HashSet<Integer> s = new HashSet<Integer>();
        for (int i = 1; i <= maximum; i++) {
            s.add(i);
        }

        return s;
    }

    public static void m (ArrayList<Integer> list, HashSet<Integer> s, int len) {
        if (len == 0) {
            System.out.println("===\nlist bei len == 0: " + list);

            set.add(list);
            System.out.println("set: " + set + "\n===");
        }
        else {
            int counter = 1;

            for (int u : s) {
                ArrayList<Integer> l = list;
                System.out.println("l Anfang for: " + l);
                l.add(u);
                HashSet<Integer> q = new HashSet<Integer>();
                for (int z : s) {
                    if (z != u) {
                        q.add(z);
                    }
                }
                System.out.println("======\nLoop-Nr: " + counter);
                System.out.println("l = " + l);
                System.out.println("q = " + q);
                System.out.println("======\n");
                counter++;
                m(l, q, len-1);
            }
        }
    }

Da sind jetzt ein paar println-Ausgaben drin, weil ich dachte, das Problem könne ja nicht so lang sein und so fügte ich nach und nach mehr ein.

Nun, natürlich soll es am Ende um weit höhere Zahlen gehen, aber zum Erkennen des Problems sollte der Fall c = 2 reichen.
Ich erwarte also die Ausgabe, dass set am Ende [[1,2],[2,1]] enthält.

Die Ausgabe, bestehend aus den printlns, sieht aber so aus:

Code:
l Anfang for: []
======
Loop-Nr: 1
l = [1]
q = [2]
======

l Anfang for: [1]
======
Loop-Nr: 1
l = [1, 2]
q = []
======

===
list bei len == 0: [1, 2]
set: [[1, 2]]
===
l Anfang for: [1, 2]
======
Loop-Nr: 2
l = [1, 2, 2]
q = [1]
======

l Anfang for: [1, 2, 2]
======
Loop-Nr: 1
l = [1, 2, 2, 1]
q = []
======

===
list bei len == 0: [1, 2, 2, 1]
set: [[1, 2, 2, 1], [1, 2, 2, 1]]
===
SIZE:
2

Wie kann das sein, was sehe ich nicht? Danke sehr für die Hilfe! :)

Liebe Grüße
Xulu
 
L

LimDul

Top Contributor
Erster Ratschlag. Bennene deine Variablen sinnvoll.

Java:
            for (int u : s) 
               for (int z : s)
Das sind keine sinnvollen Variablen. Wofür steht u, wofür z? s ist vermutlich das set.

Bei deiner Ausgabe gibt es l und q. Ich hab keine große Lust diese Verwirrung zu lösen und versuchen nachzuvollziehen was du dir dabei gedacht hast. Das einzige was ich auf die Schnelle sehe - du hast die beiden Schleifen und immer wenn es mindestens ein z gibt, was vom u abweicht. wird das z in q hinzugefügt. Wenn du die Liste 1,2 und enthält, dann ist das eigentlich sowohl für für 1 als auch 2 der Fall, weil für beide gibt es in dem Set ein Element das anders ist. Aber mir ist das zu komplex auseinderzudröseln was nun wieder q ist.
 
X

Xulu200

Mitglied
Okay, ich erkläre kurz:

1. Ich habe ein Set aus Listen (ja, es sind Permutationen), welches leer ist.
2. Ich rufe die rekursive Funktion m auf. Ihr übergebe ich eine neue leere Liste, ein Set aus den Zahlen von 1 bis c und das c.
3. m soll nun rekursiv arbeiten:
4. Eine Liste wird an m übergeben, ebenso eine Menge aus möglichen Ziffern, die an die Liste angehängt werden können.
5. Die Abbruchbedingung ist, dass die gewünschte Länge erreicht ist (also dann c).
6. Falls die Länge erreicht wurde, habe ich eine Permutation gefunden und kann diese in mein set aufnehmen.
7. Falls ich die Länge noch nicht erreicht habe, möchte ich mehrere rekursive Aufrufe starten. Für jedes mögliche Zeichen, das ich an die Liste anhängen kann, einen. Dabei machen s und z nichts Besonderes. Sie sorgen ausschließlich dafür, dass ein angehängtes Zeichen für den rekursiven Aufruf nicht mehr als anhängbar zur Verfügung steht.
Beispiel:
c = 8 und der Durchlauf steht bei [7,3,5,2]. m wird aufgerufen, indem [7,3,5,2] als bisheriges Ergebnis übergeben wird (Liste) und die Menge, die übergeben wird, ist [1,4,6,8], also die noch zu ergänzenden Zahlen. Die verbleibende Länge ist dann natürlich 4.

Tatsächlich gibt es fertige Lösungen und die Dokumentation ist auch nicht existent. Mit dem Programm möchte ich nach seinem Dienst nicht weiterarbeiten und kein anderer wird das Programm übernehmen. Da es nicht wesentlich länger wird und in seiner Kürze auch nicht sonderlich komplex, hatte ich das jetzt so gelassen.

Ich möchte trotz der Möglichkeit, das Programm neu schreiben zu können, verstehen, warum diese Implementierung nicht funktioniert.

Danke für eure Antworten! :)
Grüße
Xulu
 
X

Xulu200

Mitglied
Gelöst durch:

von
ArrayList<Integer> l = list;
zu
ArrayList<Integer> l = (ArrayList<Integer>) list.clone();

und von
m(l, q, len-1);
zu
m((ArrayList<Integer>) l.clone(), q, len-1);
 
kneitzel

kneitzel

Top Contributor
In so einem kleinen Programm noch irrelevant aber in Projekten bezüglich Refactoring Möglichkeiten und so nicht sehr schön:
Statt einem clone Aufruf (der geht nur auf konkreten Klassen, die es implementieren, nicht auf Interfaces und man sollt ein der Regel gegen Interfaces implementieren!) solltest Du einfach eine neue ArrayList erzeugen. Ein Konstruktor nimmt auch eine Collection mit Elementen.

Also wäre der Code dann: ArrayList<Integer> l = new ArrayList<Integer>(list);

Das funktioniert auch, wenn list statt ArrayList nur List (also genaue Implementation nicht bekannt) oder LinkedList oder sonst irgendwas ist.

Die Problematik mit dem Refactoring von oben noch erläutert:
a) Du machst list aus irgend einem Grund zu einer LinkedList. Die Deklaration von list kann ja entfernt von der Deklaration von l sein. Du kannst es also übersehen. Und du bekommst es erst zur Laufzeit mit, weil der cast fehl schlägt.
b) Clean Code (z.B. Robert C Martin alias Uncle Bob in seinen Büchern) empfiehlt, generell gegen Interfaces zu programmieren wo möglich. Klar, bei der Erstellung einer Instanz geht das nicht - da muss irgendwo z.B. das new ArrayList<Integer>() kommen, aber bei allem, was Du weiter gibst oder so, sollte es dann das Interface sein. Und Du nutzt dann nur das Interface.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P kurzes Codeausführen Java Basics - Anfänger-Themen 3
J kurzes problem zu JPanel Hinergrundfarbe Java Basics - Anfänger-Themen 20
C Bitte kurzes Feedback - JavaVersionen Java Basics - Anfänger-Themen 6
V ganz kurzes kskb mit Problem - keine Ausgabe Java Basics - Anfänger-Themen 2
R kurzes if-then-else statement Java Basics - Anfänger-Themen 8
danieldemetry Java - Graph Komponenten - Ausgabe Java Basics - Anfänger-Themen 0
Hamudi Bachir Java Spiel des Lebens Java Basics - Anfänger-Themen 9
Icke0801 Java - Sqlite3 Java Basics - Anfänger-Themen 5
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
t2im Java Array-Länge ändern? Java Basics - Anfänger-Themen 22
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
J Vier gewinnt in Java,Spieler Konstruktor Java Basics - Anfänger-Themen 8
Spitzli Java login mit hashed password Java Basics - Anfänger-Themen 11
josfe1234 Hilfe access denied ("java.io.FilePermission" " " "read") Java Basics - Anfänger-Themen 11
nevel Nachhilfe in Java Java Basics - Anfänger-Themen 4
O Java über cmd benutzen ? Java Basics - Anfänger-Themen 5
S Java TelephoneBookEntry search Java Basics - Anfänger-Themen 2
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Brüche in java Java Basics - Anfänger-Themen 7
L Java operator % Java Basics - Anfänger-Themen 3
rafi072001 Integer Anomalie Java Java Basics - Anfänger-Themen 7
H Java file nicht gefunden Java Basics - Anfänger-Themen 5
M Packages erstellen mit Java-Editor Java Basics - Anfänger-Themen 6
mr.kottig Großeltern herausfinden Java - Map? Java Basics - Anfänger-Themen 16
L Java erstellt leere Datei Java Basics - Anfänger-Themen 8
D Java Übungsaufgaben Java Basics - Anfänger-Themen 6
A Standardabweichung in Java berechnen Java Basics - Anfänger-Themen 10
H Java fx Java Basics - Anfänger-Themen 3
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
M Java Anfang Java Basics - Anfänger-Themen 13
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
I Java auf der Konsole Java Basics - Anfänger-Themen 5
T Die neuste Java jee Java Basics - Anfänger-Themen 12
Spandeli8 Erzeugte Objekte gegenüber Bildern hervorheben in Java Processing Java Basics - Anfänger-Themen 1
G Java Hilfe Java Basics - Anfänger-Themen 3
johnboyne Java Zeichen Trennen Java Basics - Anfänger-Themen 1
I Java Quicksort PAP Java Basics - Anfänger-Themen 2
K Buchstabenzähler Java (Anfänger) Java Basics - Anfänger-Themen 35
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
A Schleifen in Java Java Basics - Anfänger-Themen 4
Alan6 Java Editor BMI Rechner Java Basics - Anfänger-Themen 7
C java.sql Statement kann nicht geschlossen werden Java Basics - Anfänger-Themen 9
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
P myClass?.method() in Java Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
Marc111111111 Selection Sort in Java?? Java Basics - Anfänger-Themen 6
NicoDeluxe Java RAM Management Java Basics - Anfänger-Themen 26
N Groß- und Kleinschreibung bei Java: void Methode Java Basics - Anfänger-Themen 1
T SelectionSort Java Java Basics - Anfänger-Themen 1
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
T Java Fx Java Basics - Anfänger-Themen 4
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
G Java Rabatt berechnen Java Basics - Anfänger-Themen 8
MPFeuer JAVA Expert-PDF Java Basics - Anfänger-Themen 1
M Java-Applet zur Mittelwertberechnung Java Basics - Anfänger-Themen 3
Abraham42 Berechnung der Kühlung Java Java Basics - Anfänger-Themen 12
J Java Queue mit default Werten erstellen Java Basics - Anfänger-Themen 4
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
S Allgemeine Java Codes lesen und verstehen Java Basics - Anfänger-Themen 7
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
TimoN11 Java spezielle Suchprobleme - Aufgabe Java Basics - Anfänger-Themen 5
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
H Brauche Hilfe in Java Eclipse Programmieraufgabe Neuling Java Basics - Anfänger-Themen 3
JaVaN0oB java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 17
Abraham42 Sparguthaben JAVA Java Basics - Anfänger-Themen 4
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
H Audio in Java Java Basics - Anfänger-Themen 3
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
R Java (Eclipse) "Lagerverwaltung" HILFE Java Basics - Anfänger-Themen 13
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Rekursive Java-Methode Java Basics - Anfänger-Themen 13
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
bafou Dreieckszahlen in java Java Basics - Anfänger-Themen 3
P Best Practice Druck aus Java Anwendung in MacOs Java Basics - Anfänger-Themen 0
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
B java.time Duration mit Kommazahl? Java Basics - Anfänger-Themen 4
Devin Wo kann man einen Java Lehrplan finden? Java Basics - Anfänger-Themen 5
KogoroMori21 Java Datum Differenz (kleiner Fehler) Java Basics - Anfänger-Themen 10
O Java Weinachtsbaum in einem Bilderramen Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 1
Gaudimagspam BMI in Java implementieren Java Basics - Anfänger-Themen 38
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
F Fehlermeldung java.lang.NullPointerException Java Basics - Anfänger-Themen 4
S Sprung mit Java (GameGrid) Java Basics - Anfänger-Themen 9
Devin Wie lange braucht man um Java zu beherrschen und wie kann man es am schnellsten erlernen? Java Basics - Anfänger-Themen 7
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1

Ähnliche Java Themen


Oben