set contains false

ifconfig

Aktives Mitglied
Hallo,
warum liefert mir der zweite assert false statt true? Ich komm einfach nicht dahinter. Hab schon die API zu awt.Point gelesen, also equals und hashcode würden eigentlich passend overriden, klappt aber nicht.
Hier der Code:
Java:
 @Test
    public void containsTest(){
	Set<Point> set=new HashSet<Point>();
	Point p=new Point(1,0);
	set.add(p);
	assertTrue(set.contains(new Point(1,0)));
	p.setLocation(2, 0);
	assertTrue(set.contains(new Point(2,0)));	
    }

Grüße
ifconfig
 
Zuletzt bearbeitet von einem Moderator:

VfL_Freak

Top Contributor
Moin,

warum liefert mir der zweite assert false statt true?

Code:
 @Test
    public void containsTest(){
	Set<Point> set=new HashSet<Point>();
	Point p=new Point(1,0);
	set.add(p);
	assertTrue(set.contains(new Point(1,0)));
	p.setLocation(2, 0);
	assertTrue(set.contains(new Point(2,0)));	
    }

Du änderst zwar die Location von 'p', mehr aber auch nicht!
Warum sollte er sich also im SET befinden ??

BTW: bist Du sicher, dass Du "new Point..:" prüfen willst ??

Gruß
Klaus
 

EasyEagle

Aktives Mitglied
Hallo ifconfig,

ich hab das gerade ausprobiert und komm zum selben Ergebnis und musste mich auch ein wenig wundern ;)

Meine Vermutung ist folgende:
Das HashSet speichert seine Elemente in einer HashMap, wobei dann das Element (der Point) als key gespeichert wird.
Das Ganze dient der Eindeutigkeit, da man ja in einem HashSet kein Element doppelt speichern kann.
Und ich vermute mal, dass das irgendwie damit zusammenhängt.

Eine genauere Erklärung würde mich auch interessieren :)

Grüße,
EasyEagle
 
Zuletzt bearbeitet:

ifconfig

Aktives Mitglied
Eine genauere Erklärung würde mich auch interessieren :)
Grüße,
EasyEagle
ich hab gerade eine passgenaue und leicht verständliche Erklärung und Lösung "in diesem Internet" für das Problem gefunden:
Die Ursache des Problems liegt in der Referenz-Semantik von Java. Der Benutzer bekommt über die Referenzen Schreib-Zugriff auf die Objekte im Container und kann die dort abgelegten Objekte an Ort und Stelle verändern. Jede Veränderung der Objekte, die das Ergebnis von hashCode()beeinflusst, zerstört aber den Container, weil das Objekt nach der Veränderung eigentlich in einem anderen Bucket abgelegt sein müsste. Das ist ein generelles Problem bei allen Containern, deren Organisation in irgendeiner Form auf dem Inhalt der gespeicherten Objekten beruht und bei denen Schreib-Zugriff auf die gespeicherten Objekte möglich ist. In diese Kategorie fallen alle hash-basierten, aber auch alle baum-basierten Container in Java. Schützen kann man sich vor dieser Falle nur durch Programmierdisziplin, indem man es unterlässt, enthaltene Objekte an Ort und Stelle im Container zu ändern. Man muss statt dessen das alte Objekte aus dem Container entfernen und das neue "modifizierte" Objekt in den Container einfügen.
Quelle: AngelikaLanger.com - Implementing the hashCode() Method - Angelika Langer Training/Consulting


Danke euch für die Mithilfe. Aber von der Laufzeit oder Rechenaufwand scheint mir das ja mega-overheadbelastet zu sein, bei jeder Prüfung das zu ändernde Objekt entfernen und mit neuen Daten wieder adden...also ich programmiere gerade ein 2D-Spiel, wo auf jeden Tastendruck beim Steuern und bei jedem Timerrefresh jede Sekunde mehrfach auf contains geprüft wird...da wird das Programm ja nichtmehr fertig mit der Objekt-Schieberei...ich könnte mir gut vorstellen, dass das in C++ effektiever geht, oder?
 
Zuletzt bearbeitet:

Bug Fisher

Bekanntes Mitglied
Möglicherweise würde es in c++ effektiver laufen, das setzt aber auch voraus, dass du c++ gut beherrschst.
Warum nimmst du statt eines Sets nicht einfach eine Liste. Weil du keine doppelten Einträge haben willst ?
 

ifconfig

Aktives Mitglied
genau, weil ich keine doppelten Einträge wollte...also ich bilde ein Spielbrett ab, das 20 Reihen und 20 Spalten hat. Auf jedem Platz kann entweder ein Player, Enemy oder Obstacle stehen. Ursprünglich hatte ich das ganz simpel und lowlevel mit einem 2-dimensionalen int-Array gelöst. Aber da hat es mich genervt, dieses ewige Index +1/-1 für up-down-left-right move und check. Das fand ich total unleserlich, trotzdem dass ich Helpermethoden gebaut habe. Da hast du dann irgendwann keinen Bock mehr in deinem Code weiterzubauen, weil du dich jedesmal erst reindenken musst. Darum wollte ich jetzt eine komplett neue Version bauen wo Lesbarkeit des Codes oberste Priorität hat, weil das auch die Wartbarkeit und Änderbarkeit verbessert mit Objektorientierung.
Momentan überleg ich, es mit einem 2-dimensionalen ArrayList nochmal zu versuchen. Da ist ja per 2er-Index auch Eindeutigkeit gegeben und hab trotzdem die Bequemlichkeit des Collection-Frameworks und OO.
Mit C++ hab ich seit Jahren nix mehr gemacht. Aber das Grundproblem der Hashindexierung besteht bestimmt auch in C++, also geht es wohl eher darum die passendste Datenstruktur für meinen Anwendungsfall zu finden, wohl als Kompromiss aus Effektivität und Wartbarkeit. Und da kann ich dann schon bei Java bleiben.
 
Zuletzt bearbeitet:

arilou

Bekanntes Mitglied
Bitte genau trennen:
Du darfst durchaus mehrfach prüfen, ob ein Objekt in dem HashSet enthalten ist.
Du darfst es nur nicht (während es enthalten ist) verändern - dafür muss es erst entnommen werden, dann kannst du es ändern, und anschließend wieder einfügen.

(Außerdem - ist denn sicher, dass es immernoch "einmalig" ist, wenn es verändert wurde?)
 

ifconfig

Aktives Mitglied
also wenn ich mir das so überlege, ist es ja eigentlich garnicht so viel Rechenzeit, die da verbraten wird, es werden ja keine neuen Objekte erstellt, sondern nur die Referenzen hin und hergeschubst. Ich bau das jetz mal so ein, also erst remove, dann setlocation und dann wieder adden. Spiele sind nunmal an sich mit einem gewissen Rechenaufwand verbunden, da kommt man nicht drumrum. Und ich hab ja auch nicht vor es auf einem Embeded System laufen zu lassen...wobei diese Dinger heute ja auch schon enorme Power haben und sowas mit Links schaffen.
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Eigentlich muss man "nur" darauf achten, dass die Wert, die in hashCode() und equals() genutzt werden nicht verändert werden.

Dazu sollte man diese final machen. Oder man arbeitet gleich mit Immutable-Objects, was ich im Fall von Point sogar empfehlen würde.
 

ifconfig

Aktives Mitglied
ja aber gerade das sind die Werte die ich ändern muss, die x und y Koordinaten. Das ist ja der Sinn der Sache beim moven der Tiles im Spielfeld. So wie ichs vorhin geschrieben habe, passt jetz alles. Alles rodscha in Kambodscha.
Oder hab ich dich irgendwie falsch verstanden?
 
Zuletzt bearbeitet:

ifconfig

Aktives Mitglied
ich habe mein Spiel jetzt auf meiner Homepage online gestellt...ist aber noch nicht ganz fertig, aber bisschen Rumspielen geht schon :)
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
K public boolean contains (Object obj) > true or false Java Basics - Anfänger-Themen 16
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
R contains ist case-intrensive Java Basics - Anfänger-Themen 7
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
B String: Groß- und Kleinschreibung ignorieren bei Contains? Java Basics - Anfänger-Themen 2
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
G String nach Contains/Regex Java Basics - Anfänger-Themen 2
J Datentypen Anwendung von String contains Java Basics - Anfänger-Themen 4
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
S Polygon contains - Erläuterung Java Basics - Anfänger-Themen 3
S Methode contains beim String Java Basics - Anfänger-Themen 2
A contains bzw. indexOf liefert keine Treffer? Java Basics - Anfänger-Themen 3
L String.contains() - substring erstellen Java Basics - Anfänger-Themen 3
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
K Methoden contains()-Methode für Punkt in Polygon Java Basics - Anfänger-Themen 5
G NetBeans Contains files with errors Java Basics - Anfänger-Themen 14
D String contains CharSequence? Java Basics - Anfänger-Themen 3
S Hexstring contains & split Java Basics - Anfänger-Themen 2
R Collections Probleme mit contains()-Methode [LinkedList] Java Basics - Anfänger-Themen 5
Z Fehler bei .contains auf Double Liste Java Basics - Anfänger-Themen 4
C Datentypen Probleme mit Vector.contains() Java Basics - Anfänger-Themen 10
DasBrot Datentypen HashSet contains() Java Basics - Anfänger-Themen 3
R Datentypen Problem mit Contains bei String[] Java Basics - Anfänger-Themen 4
T Polygon.contains Fehler Java Basics - Anfänger-Themen 2
M HashSet.contains() Java Basics - Anfänger-Themen 2
Rene_Meinhardt Polygon.Contains() funktioniert nicht richtig? Java Basics - Anfänger-Themen 3
A ArrayList<T>: Problem mit contains() bei parametrisiertem T Java Basics - Anfänger-Themen 6
H contains (für LIST) funktioniert nicht - ich weiß nicht warum? Java Basics - Anfänger-Themen 7
B String contains.("") Java Basics - Anfänger-Themen 3
K ArrayList contains()-Methode Java Basics - Anfänger-Themen 10
G Erzeugung eines Dreiecks und die contains Methode Java Basics - Anfänger-Themen 2
R Vector mit contains abfragen Java Basics - Anfänger-Themen 32
H Strings suchen mit der Hilfe von "contains" Java Basics - Anfänger-Themen 6
D ArrayList contains mit Wildcard Java Basics - Anfänger-Themen 3
M Fehlermeldung (The method contains(String) is. Java Basics - Anfänger-Themen 3
lin Kommandozeile bzw. if(cl.contains("xy")) { //do } Java Basics - Anfänger-Themen 7
S wie wende ich "contains(CharSequence s)" auf mein Java Basics - Anfänger-Themen 3
G contains - Punkt in Kreis enthalten? Java Basics - Anfänger-Themen 6
D contains bei JTextArea anstatt bei JTextField Java Basics - Anfänger-Themen 8
S Text eines JTextField mit contains überprüfen Java Basics - Anfänger-Themen 12
I String Expression mit Java validieren (true / false) Java Basics - Anfänger-Themen 34
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
T Invertierung !(false/true) Java Basics - Anfänger-Themen 11
H Koordinateneingabe im 2D Array soll true/false zurückgeben Java Basics - Anfänger-Themen 5
M Wie gebe ich true or false aus? Java Basics - Anfänger-Themen 9
helldunkel While Schleife trotz false Java Basics - Anfänger-Themen 4
M TextArea scrollbar bei editable false Java Basics - Anfänger-Themen 5
M Erste Schritte while boolean=false läuft nur bei true??? Java Basics - Anfänger-Themen 23
J Array Muster mit true und false Java Basics - Anfänger-Themen 6
N Boolean Werte - immer "false" Java Basics - Anfänger-Themen 5
O Was verursacht den Rückgabewert false bei der Methode ready() eines BufferedReaders Java Basics - Anfänger-Themen 9
B setOpaque(false) funktioniert nicht Java Basics - Anfänger-Themen 16
C ActionEvent mit CheckBox (true und false) Java Basics - Anfänger-Themen 6
M !boolean das selbe wie boolean == false? Java Basics - Anfänger-Themen 3
C Scrollpanel autoscroll(false) macht nix Java Basics - Anfänger-Themen 2
J if false Java Basics - Anfänger-Themen 3
F Enabled (false), dennoch nutzbar? Java Basics - Anfänger-Themen 3
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
W Methoden "Fröhliche Zahl" true | false Java Basics - Anfänger-Themen 14
D Frage zu true false in Schleifen Java Basics - Anfänger-Themen 8
feardorcha boolean array false - true - Abfrage Java Basics - Anfänger-Themen 10
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
R If-Abfrage liefert false zurück, wieso ? Java Basics - Anfänger-Themen 20
A .setEnabled(false) zu langsam? Java Basics - Anfänger-Themen 17
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
B if erzeugt nur immer ein FALSE Java Basics - Anfänger-Themen 2
I wie definiere ich ja oder nein für true or false Java Basics - Anfänger-Themen 7
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
Luk10 Methode gibt false zurück! Java Basics - Anfänger-Themen 2
M true und false treiben mich ins Grab! Java Basics - Anfänger-Themen 5
C setResizable(false) unter NetBeans Java Basics - Anfänger-Themen 3
F Regulärer Ausdruck warum false ? Java Basics - Anfänger-Themen 3
Y setVisible(false) Java Basics - Anfänger-Themen 21
D "true" -> Boolean wird false?! Java Basics - Anfänger-Themen 6
D Array zufällig mit 1 oder 0 oder mit true oder false füllen Java Basics - Anfänger-Themen 5
S Elemente einer Liste mit true / false Werten Java Basics - Anfänger-Themen 3
S if anweisung wird ausgeführt egal ob bedingung true o. false Java Basics - Anfänger-Themen 2
RK Scanner.hasNext() ist niemals false! o_O Java Basics - Anfänger-Themen 3
C regexp gibt immer false aus Java Basics - Anfänger-Themen 4
S jtable.editable(false) CODE? Java Basics - Anfänger-Themen 3
O true false Java Basics - Anfänger-Themen 5
G Fenster.setVisible(true); true -> false Zwischenwert? Java Basics - Anfänger-Themen 11
D Buttons gehen trotz enebled(false) Java Basics - Anfänger-Themen 8
A Übungsaufgabe lösen - Problem mit true und false Java Basics - Anfänger-Themen 6
M Textboxen lassen sich ändern obwohl editable = false Java Basics - Anfänger-Themen 8
M Per Button einer Funktion true oder false übermitteln? Java Basics - Anfänger-Themen 4
L Bedingung immer false, auch wenn zwei Strings gleich sind Java Basics - Anfänger-Themen 11
R Ist ! gleich false? Java Basics - Anfänger-Themen 3
M if(b){ b=false}else{b=true} Java Basics - Anfänger-Themen 4
A Warum ist 1/10 == 0.1 false? Java Basics - Anfänger-Themen 4
M Prob bei JTextArea auf .setEditable(false) setzen Java Basics - Anfänger-Themen 2
Z while (eingabe.equals("ENDE") == false) Java Basics - Anfänger-Themen 5
frau-u Eine Exception bei false Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben