Kurzes Java-Programm, das sich komisch verhält

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
 

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.
 

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
 

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);
 
K

kneitzel

Gast
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
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 23
W Methoden java map ersatz für c++map Java Basics - Anfänger-Themen 2
M Erste Schritte Java Primzahltester Java Basics - Anfänger-Themen 4
A csv Reader für Java? Java Basics - Anfänger-Themen 27
K Java - Enums Java Basics - Anfänger-Themen 30
tomzen Java Unterstützung für exel dateien installieren. Java Basics - Anfänger-Themen 2
Rookar java.lang.NoClassDefFoundError: org/json/JSONException Java Basics - Anfänger-Themen 2
Rookar Mit Button andere java öffnen Java Basics - Anfänger-Themen 4
F Java Object to Hashmap ? Java Basics - Anfänger-Themen 6
I Backend in Java und Ansicht von Dateien in statische HTML Seiten? Java Basics - Anfänger-Themen 15
R Input/Output Verwendung des Euro-Zeichens in Java Java Basics - Anfänger-Themen 7
I Push Nachrichten von JAVA EE App an Mobile App Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben