ArrayListe , Wo ist mein Fehler?

WiNNie_p00h

Mitglied
Hallo, sitze seit längerem jetzt an einem Codeteil aus einem Scrabble-artigem Programm welches ich programmiert habe.
Es hat einen kleinen Fehler den ich nicht weg bekomme und zwar im folgenem Abschnitt:

Java:
for (int i = 0; i < 12; i++) {
		for (int j = 0; j < 12; j++) {
			if (!playingField[i][j].isEmpty()) {	
                              filteredWords = getAvaiableList(playingField[i][j].getText());
			      filteredWords = filterList(filteredWords);
			      for (Word item : filteredWords) {
				   item.setXLetter(j);
				   item.setYLetter(i);
				   avaiableWords.add(item);
			       }  
.......

Da es ja nur ein kleiner Teil eines schon über 600 Zeilen großen Programms ist hier eine kleine Erklärung:
also filteredWords ist eine Arrayliste aus Wörtern, jedes Wort hat einen String text, einen Int value, int XLetter und int YLetter.
das sind die wichtigen sachen für diesen Abschnitt.
Die Wörter aus der Liste sollen dann nach hinzufügen von X und Y in die Liste avaiableWords geaddet werden.
X und Y Letter bedeutet wo der buchstabe liegt an dem angelegt werden soll.
an sich funktioniert alles, nur dass er wenn der Text der Wörter gleich ist, also ein Wort an mehreren Stellen angelegt werden könnte, irgendwie den X und Y (bzw i und j) nicht übernimmt oder besser gesagt überschreibt.
also wenn in der unteren For schleife eine Ausgabe mache vom item Text und X und Y dann gibt er es mir richtig wieder.
wenn ich aber nach der ganzen schleife die avaiableWords ausgeben lasse dann hat er bei item wo der gleiche text drinen steht auch gleiche X und Y werte, und zwar immer vom letzten geaddetem item.

beispiel:
er findet im ganzen Druchlauf durch die for-schleifen 4 Wörter die er legen könnte:
ab mit X=6 Y=5
lampe mit X=7 y=5
lampe mit X=9 y=6
lampe mit X=11 Y=9

das ist ungefähr ein reales Beispiel wo bei mir der Fehler auftrat, wenn ich die Werte hinter avaiableWords.add(item); von item ausgeben lasse kommt es richtig raus.

nachdem die items in die avaiableWords liste geaddet wurden udn ich diese später ausgeben lasse mit den Werten kommt dann folgendes:
ab mit X=6 Y=5
lampe mit X=11 y=9
lampe mit X=11 y=9
lampe mit X=11 Y=9

deswegen checkt er später dann nur ein einer position ob lampe gelegt werden kann und wenns an der Stelle nicht geht bricht er ab obwohl an er eigentlich an einer der anderen Stellen legen könnte.

so hoffe es ist klar geworden was ich will und ich hoffe mir kann jemand helfen.
 

Michael...

Top Contributor
Dein Datenmodell ist etwas ungünstig.

So wie es mometan ist, darfst Du nicht das item in availableWords stecken, sondern eine Kopie.
Du steckst ja (bei mehreren Möglichkeiten) ein und das selbe item mehrfach in die Liste und änderst jedesmal dessen X und Y Wert --> dasselbe item kommt zwar mehrfach in der Liste vor, aber (da es sich ja immer um das selbe Objekt handelt) immer mit den zuletzt gesetzten x und y Werten.

Eigentlich brauchen Deine Wörter in filteredWords gar keine x und y Werte (die sind da nämlich völlig überflüssig). Erst in availableWords wird ja die Position relevant --> es handelt sich um zwei Listen, die eigentlich zwei unterschiedliche Typen beinhalten müssten.
 

MarderFahrer

Gesperrter Benutzer
Das ist jetzt nur einmal ein Schuss ins Blaue von mir aber:

Ist es nicht so, dass in der inneren for-Schleife (mit int j) wenn ein Spielfeld nicht leer ist jedesmal über die gesamte filteredWords List iteriert wird? Dabei wird dann jedem "Word" die zwei Items setXLetter und setYLetter mit den derzeit gültigen Variablen "j" und "i" zugewiesen.
D.h alle Inhalte der Liste bkommen dieselben Werte.

Java:
for (Word item : filteredWords) {
                   item.setXLetter(j);
                   item.setYLetter(i);
                   avaiableWords.add(item);
}

Ich nehme an, in der filteredWords List stehen immer alle gefunden Wörter. (Einmal das eine "ab" und einmal die drei mal "lampe")
Da "ab" nur einmal vorkommt, wird auch nichts überschrieben. Aber an der Stelle, wo die filteredWords List die drei "lampe" enthält, läuft die For-Schleife mit j doch quasi über alle drei items aus der Liste. Dabei wird für jedes Word Item jedesmal derselbe aktuelle X,Y Wert zugewiesen.

Man könnte also sagen für "lampe" passiert anstelle der oben eingefügten "for (Word item : filteredWords)" das:
Java:
Word item = "lampe(1)"
                   item.setXLetter(j);
                   item.setYLetter(i);
                   avaiableWords.add(item);

Word item = "lampe(2)"
                   item.setXLetter(j);
                   item.setYLetter(i);
                   avaiableWords.add(item);

Word item = "lampe(3)"
                   item.setXLetter(j);
                   item.setYLetter(i);
                   avaiableWords.add(item);

In jeder Iteration der For-Schleifen mit i und j, in der die ArrayList "filteredWords" durchlaufen wird, wird jedes Element mit identischen X,Y Werten bedacht. Darum ist am Ende auch immer der Letzte gültige X,Y Wert in allen Word Items enthalten.

Du findest in den verschachtelten For-Schleifen drei unterscheidliche i,j Stellen, wo "lampe" gefunden wird, aber bei jedem Fund überschreibst du alle bisher in der filteredWords List stehenden Werte mit denselben X,Y Werten.
 

WiNNie_p00h

Mitglied
also wahrscheinlich habt ihr recht, weils sonst würde es ja funktionieren. aber jedes mal wenn ich mir n blatt papier nehme und das Schritt für Schritt durchgehe müsste es meiner Logic nach zu Folge eigentlich gehen.

Ich sehe nicht wirklich dass er die bisherigen Wörter in avaiableWords überschreibt.
er guckt auf jedem Feld welcher Buchstabe dort liegt und guckt dann welche Wörter dort angelegt werden können.
das können also auch mehrere Wörter sein. also können in filtered Words auch mehrere verschiedene Wörter stehen.
Aber in dem Beispiel steht doch jedes mal nur 1 Wort in filteredWords, was man an einer Ausgabe in der for schleife sehen kann.

Ich hab nochmal ne ausgabe gemacht von avaiableWords innerhalb der Schleife also jedes mal wenn ein neues item geaddet wird:
ab mit X=6 Y=5
lampe mit X=7 y=5

ab mit X=6 Y=5
lampe mit X=9 y=6
lampe mit X=9 y=6

ab mit X=6 Y=5
lampe mit X=11 y=9
lampe mit X=11 y=9
lampe mit X=11 Y=9

also er überschreibt wirklich es wirklich immer. Bin mir aber immernoch nich ganz sicher wo genau der Fehler ist bzw Wie kann ich das umgehen?
hat jemand ne alternative?
das X und das Y brauche ich für andere funktionen, es muss also abgespeichert sein welcher Buchstabe der schon aufm Spielfeld liegt für das Anlegen benutzt wird.
Mir wäre es lieb wenn jemand ne Lösung wüsste dass ich die avaiableWords liste so bekomme wie ich sie am ende will.

hier ein weiteres beispiel für den Fehler wenn er mehrere Wörter findet die er legen kann (weil zb andere Buchstaben auf der Hand sind):
ab : 7/6

eng : 11/8
lage : 11/8
lagen : 11/8
lampe 11/8
lange : 11/8
name: 11/8
glas : 11/6

eng : 11/8
lage : 11/8
lagen : 11/8
lampe:11/8
lange : 11/8
name: 11/8

eng : 11/8
lage : 11/8
lagen : 11/8
lampe: 11/8
lange : 11/8
name: 11/8

man hat die Buchstaben l, a, m, p, n, g auf der Hand und es gibt drei 'e' wo man anlegen kann und ein 'b' liegt auch
(bisher liegen "abends" und "see" durch das 's' verbunden)
er findet also für jedes e die gleichen Wörter, der test ob diese wirklich gelegt werden können kommt erst später.
erst wird das Wort mit den meisten Punkten rausgesucht, dazu hat jedes Wort einen Wert abgespeichert, kann dieses nicht gelegt werden wird es aus der avaiableWords Liste gelöscht und es wieder das Wort mit den meisten Punkten rausgesucht. haben mehrere Wörter die gleiche Punktzahl nimmt er immer das letzte davon in der Liste.

so wird lampe bei 11/8 versucht und kann nicht gelegt werden, soll er das dann löschen (funktioniert auch) und das näcshte lampe nehmen mit anderen Koordinaten, aber das geht halt nicht weil er für jedes Lampe die gleichen X und Y werte abgespeichert hat und wir man oben sieht passiert das bei allen Wörtern die man an mehreren stellen anlegen kann.

naja also das war jetzt das drumrum...wenn jemand eine einfache Lösung weiß wäre das echt toll
 

WiNNie_p00h

Mitglied
In jeder Iteration der For-Schleifen mit i und j, in der die ArrayList "filteredWords" durchlaufen wird, wird jedes Element mit identischen X,Y Werten bedacht. Darum ist am Ende auch immer der Letzte gültige X,Y Wert in allen Word Items enthalten.

Du findest in den verschachtelten For-Schleifen drei unterscheidliche i,j Stellen, wo "lampe" gefunden wird, aber bei jedem Fund überschreibst du alle bisher in der filteredWords List stehenden Werte mit denselben X,Y Werten.

So erstmal sry für den Doppeltpost, habe mich jetzt erst registriert nach den 2 einträgen^^ und konnte nicht editieren.

Also was du schreibst dürfte so eigentlich nicht ganz sein:
"Du findest in den verschachtelten For-Schleifen drei unterscheidliche i,j Stellen, wo "lampe" gefunden wird, "
das ist korrekt
"aber bei jedem Fund überschreibst du alle bisher in der filteredWords List stehenden Werte mit denselben X,Y Werten."
das ist zwar auch korrekt, aber in fileredWords stehen zu dem Zeitpunkte ja auch nur die Wörter die an der stelle X ,Y (also j und i) angelegt werden können, also sollen diese auch alle den gleichen wert haben. siehe mein bespiel oben, er kann für jedes 'e' 7 verschiedene Wörter anlegen. all diese 7 Wörter haben den gleichen X und Y Wert.
 

Michael...

Top Contributor
Aber das Word-Objekt ist immer dasselbe. Es wird mehrfach in availableWords referenziert, existiert aber nur einmal --> ändert man über die Referenzen x und y wirkt sich das auf das Objekt aus und nicht auf die Referenz selbst.
Mir scheint Dir ist der Unterschied zwischen Objekt und Referenz noch nicht so ganz klar.
Irgendjemand hier im Forum hatte mal die Referenz mit einer Fernbedienung verglichen. Das macht es eigentlich ganz gut deutlich.
Vielleicht hilft auch folgendes Bsp.:
Du hast ein Auto (Objekt) und mehrerer Schlüssel (Referenzen), jeder der ein Schlüssel hat kann das Auto umparken (X Y) und da wo der letzte das Auto abgestellt hat da steht's unabhängig davon wo es der erste geparkt hat.
In Deinen Listen hast Du nur die Schlüssel, das Auto selbst liegt irgendwo (einmalig) im Arbeitspeicher.
 

WiNNie_p00h

Mitglied
Ah danke, also an sich war mir der unterschied klar. nur habe ich nich dran gedacht dass bei
avaiableWords.add(item) kein neues objekt erstellt wird.

Habe das Problem jetzt gelöst mit:
Java:
					for (Word item : filteredWords) {
						Word tmp = new Word(item.getText(),item.getValue(),j,i);
						avaiableWords.add(tmp);
						
						}

danke an alle für die Hilfe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
M Arrayliste mit beliebig vielen Namen befüllen Java Basics - Anfänger-Themen 4
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
Poppigescorn Mithilfe einer Arrayliste einen Notenspiegel ausgeben Java Basics - Anfänger-Themen 12
A Objekt in Arrayliste Java Basics - Anfänger-Themen 2
L Arrayliste von hinten nach vorne ausgeben Java Basics - Anfänger-Themen 10
X Methode kann auf ArrayListe nicht zugreifen! Java Basics - Anfänger-Themen 10
F ArrayListe manuell programmieren? Java Basics - Anfänger-Themen 24
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
S ArrayListe in einer JComboBox anzeigen Java Basics - Anfänger-Themen 10
R Eine Arrayliste in XML abspeichern und laden können Java Basics - Anfänger-Themen 7
P Klasse in Klasse einfügen (arrayliste) Java Basics - Anfänger-Themen 7
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
A ArrayListe ist nur lokal vorhanden Java Basics - Anfänger-Themen 5
L Input/Output Sortieren Speichern Laden von ArrayListe Java Basics - Anfänger-Themen 14
B ArrayListe in Arraylist Problem Java Basics - Anfänger-Themen 3
N Kopieren einer ArrayListe Java Basics - Anfänger-Themen 3
S ArrayListe??? Java Basics - Anfänger-Themen 2
J Arrayliste in RandomAccesFile speichern Java Basics - Anfänger-Themen 7
D komplizierte Arrayliste sortieren Java Basics - Anfänger-Themen 17
J Arrayliste (gefüllte mit arrays) nach datum sortieren Java Basics - Anfänger-Themen 3
K ArrayListe erstellen mit vielen (unendlichen) Weren ??? Java Basics - Anfänger-Themen 29
B Aufgabe: Arrayliste ausgeben, stimmt es so? Java Basics - Anfänger-Themen 8
G Arrayliste mit Objekt anhand von Strings sortieren Java Basics - Anfänger-Themen 8
G ArrayListe vom Server nach Client schicken Java Basics - Anfänger-Themen 17
C ArrayListe ->liste.get Java Basics - Anfänger-Themen 13
ChaosNo1 Arrayliste global nutzen? Java Basics - Anfänger-Themen 4
C Elemente aus Arrayliste ausgeben Java Basics - Anfänger-Themen 6
S Arrayliste füllen Java Basics - Anfänger-Themen 4
O ArrayListe mit Objekten Java Basics - Anfänger-Themen 2
B ArrayListe . WIE AUSLESEN ? Java Basics - Anfänger-Themen 5
G ArrayListe Java Basics - Anfänger-Themen 14
T Objekte aus Datei in ArrayListe werfen Java Basics - Anfänger-Themen 3
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
dennis_lnz Klassen Wie kann ich mein Java Textadventure verbessern, um ein Klassendiagramm zu erstellen? Java Basics - Anfänger-Themen 9
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
T Mein Programm hat Fehler Java Basics - Anfänger-Themen 4
S Brauche hilfe in Java [Fehler in mein Code]? Java Basics - Anfänger-Themen 2
S Wie ende ich mein Pogrammierung? [Hilfe] Java Basics - Anfänger-Themen 1
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
M Warum berechnet mein Primzahlenprog zu hohe Zahlen nicht? Java Basics - Anfänger-Themen 20
M OOP Mein erstes Textadventure... Java Basics - Anfänger-Themen 3
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
x-tshainge Mein Programm lässt sich nicht Starten Java Basics - Anfänger-Themen 8
W Warum läuft mein Programm nicht? Java Basics - Anfänger-Themen 14
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 6
W Ist mein Struktogram richtig erstellt worden? Java Basics - Anfänger-Themen 4
W Erste Schritte Warum funktioniert mein Programm nicht ? ~if Anweisung~ Java Basics - Anfänger-Themen 4
A Erste Schritte Mein Programm erkennt die variable EinAus.readInt nicht Java Basics - Anfänger-Themen 15
N Warum terminiert mein Programm nicht? Java Basics - Anfänger-Themen 13
G Wie kann ich mein Quellcode als Programm vom desktop starten? Java Basics - Anfänger-Themen 1
P Wie kann ich mein Programm zu einer App umwandeln? Java Basics - Anfänger-Themen 4
M Mein erstes Programm Java Basics - Anfänger-Themen 3
A Mein 1x1 Programm funktioniert nicht? Java Basics - Anfänger-Themen 2
G Input/Output Wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
G Variablen Was ist mein Fehler? Java Basics - Anfänger-Themen 2
C Warum funktioniert mein If Statement nicht richtig? Java Basics - Anfänger-Themen 18
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
W Compiler-Fehler Fehler - <identifier> expected, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
M Mein erstes Java Programm Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
N mein RegEx Java Basics - Anfänger-Themen 2
N Mein Bubblesort sortiert mein Array nicht Java Basics - Anfänger-Themen 2
W Wie hat mein Lehrer das gemacht. Java Basics - Anfänger-Themen 2
Z Klassen Warum wird mein Objekt nicht erkannt? Java Basics - Anfänger-Themen 2
J Erste Schritte Zweithöchster Wert eines Arrays herausfinden - warum klappt mein Code nicht? Java Basics - Anfänger-Themen 3
A Wie kann ich mein Programm noch effizienter machen? Java Basics - Anfänger-Themen 1
C Mein Video zu Java Grundlagen Java Basics - Anfänger-Themen 8
T Eclipse kennt mein Button nicht... Java Basics - Anfänger-Themen 5
J Wo liegt nur an dieser einfachen Bedingung mein Fehler? Java Basics - Anfänger-Themen 8
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
D Brauche Hilfe für mein übungsprogramm Java Basics - Anfänger-Themen 16
T Mein String in ein JLabel stecken Java Basics - Anfänger-Themen 2
T mein erstes Java projekt Java Basics - Anfänger-Themen 8
H Kann ich mein Programm vereinfachen? Java Basics - Anfänger-Themen 3
J Methoden Wo ist mein Fehler ?! Java Basics - Anfänger-Themen 9
1 Mein erstes Programm, HELP!! Java Basics - Anfänger-Themen 2
R .txt in mein Javaprogramm hineinschmelzen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben