HashMap.containsKey.

Status
Nicht offen für weitere Antworten.

buzl

Mitglied
Hallo,

ich habe eine HashMap wo eine Klasse als Schlüssel und ein Integer als Wert hergenommen wird, hier genannt map.

Die Schlüsselklasse enthält zwei IntegerInstanzvariablen die x und y Wert eines Koordinatensystems repräsentieren.

Wenn ich nun zwei Schlüsselwertepaare in meine HashMap eintrage.
Sagen wir Klasse a mit x = 1 und y = 2 und
Klasse b mit x = 2 und y = 3.

Die Klasse stellt nun eine Methode bereit mit der ich x und y verändern kann.
Vereinfacht erhöht sie hier x und y jeweils um 1 und nene siee inkrement.

Wenn ich jetzt mit mit map.containsKey(a.inkrement()) abfrage gibt er mit false zurück.

Meines Wissen frägt die Methode containsKey doch die Gleichheit des Schlüsselpaares bei Klassen mit equals ab.

ich habe in meiner Klasse equals überschrieben das es x und y vergleicht.

auch hashCode habe ich überschrieben und das inkrementierte a hat den selben hashCode wie das ursprüngliche a.

Wieso liefert mir containsKey dann false zurück?

Ich hoffe jemand hat eine Lösung für mein Problem. Danke im Voraus.
 

Wildcard

Top Contributor
ich habe in meiner Klasse equals überschrieben das es x und y vergleicht.

auch hashCode habe ich überschrieben und das inkrementierte a hat den selben hashCode wie das ursprüngliche a.

Wieso liefert mir containsKey dann false zurück?
Wenn du x und y inkrementierst sind sie offensichtlich nicht mehr gleich, folglich liefert deine equals 'false'
 

Leroy42

Top Contributor
Ganz einfach, WEIL du equals und hashCode überschrieben hast.

Dadurch wird dein Objekt unter einem Hashcode gespeichert,
der, nach Veränderung des Objekts, nicht mehr dem aktuellen
Hashcode entspricht.

Folglich kann das Objekt auch nicht wiedergefunden werden.
 

NTB

Bekanntes Mitglied
hmm aber er hat ja gesagt, dass das inkrementierte a den gleichen Hash hat, wie das ursprüngliche.
Hast Du Lust, eben ein Beispiel zu basteln?
 

Leroy42

Top Contributor
Das habe ich überlesen.

Dennoch: Eine Hashmap sucht zuerst über den Hashcode
(der dann ja korrekt ist) und danach über equals
 

NTB

Bekanntes Mitglied
Ich hab mir mal die Mühe gemacht:

Code:
public class Test {

    public static void main(String[] args) {
        MyObject mo = new MyObject();
        HashMap hm = new HashMap();
        hm.put(mo,new Integer("42"));
        System.out.println(hm.containsKey(mo));
        mo.increment();
        System.out.println(hm.containsKey(mo));
    }
}

class MyObject {
    private int x = 1;
    private int y = 1;
    
    public void increment()  {
        x++;
        y++;
    }
    
    public boolean equals() {
        return x==y;
    }
    
    public int hashCode() {
        return 5;
        //return x+y;     // das liefert ein false
    }

Ergibt beide Male true.
Die Equals Methode wird allerdings gar nicht gebraucht. Ich denke mal, Du hast irgendwo anders noch einen Fehler. Sicher, dass der Hashcode auch nach dem Inkrementieren gleich ist?
 

buzl

Mitglied
Danke für die Antworten.

Hab jetzt mal vereinfacht die Klasse mit Testausgaben gepostet.

Code:
public class Node {
	
	private int x,y;

	public Node(int[] pos) {
		this(pos[0], pos[1]);
	}
	
	public Node(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	public Node neighbours(BaseRobot.Direction direction) {
		switch(direction) {
			case NE:
				return new Node(x+1, y+1);
			case NW:
				return new Node(x-1, y+1);
			case SW:
				return new Node(x+1, y-1);
			case SE:
				return new Node(x-1, y-1);
			case W:
				return new Node(x+1, y);
		}
		// East als default
		return new Node(x-1, y);
	}
	
	public boolean equals(Node other) {
		return x == other.x && y == other.y;
	}
	
	public String toString() {
		return x+"/"+y;
	}
	
	public int hashCode() {
		return x+y;
	}
	
	public static void main(String... args) {
		int[] a = new int[] {1, 2};
		Node one = new Node(a);
		int[] b = new int[] {2, 3};
		Node two = new Node(b);
		System.out.println(one.equals(two.neighbours(BaseRobot.Direction.SE)));
		HashMap<Node, Integer> lala = new HashMap<Node, Integer>();
		lala.put(one, 1);
		lala.put(two, 2);
		System.out.println(lala.toString());
		Node three = one.neighbours(BaseRobot.Direction.E);
		System.out.println(three.toString());
		System.out.println(lala.containsKey(three));
		
		System.out.println("");
		int aa = 1;
		int bb = 2;
		HashMap<Integer, Integer> lulu = new HashMap<Integer, Integer>();
		lulu.put(aa, 1);
		lulu.put(bb, 2);
		System.out.println(lulu.containsKey(aa));
	}

Ausgabe:

true
{1/2=1, 2/3=2}
0/2
false

true
 

NTB

Bekanntes Mitglied
Mach doch mal in der leeren Zeile dieser Main folgendes:

Code:
System.out.println(one.hashCode);
System.out.println(two.hashCode);
System.out.println(three.hashCode);

was kommt da raus?
 

buzl

Mitglied
haben den selben hashCode

ich muss jetzt weg drum werde ich länger nicht antworten können.

ich melde mich dannach wieder
 

NTB

Bekanntes Mitglied
Du willst doch erreichen, dass "contains(three)" ein "true" zurückgibt, weil es von "one" kommt, oder nicht?

Dazu müssen one und three den gleichen hashCode haben. Haben sie aber natürlich nicht.
 

buzl

Mitglied
wie gesagt sie haben den gleichen hashCode

hab in der main oben nen kleinen fehler gehabt nur vertippt aber schau mal:

neue main:
Code:
	public static void main(String... args) {
		int[] a = new int[] {1, 2};
		Node one = new Node(a);
		int[] b = new int[] {2, 3};
		Node two = new Node(b);
		System.out.println(one.equals(two.neighbours(BaseRobot.Direction.SE)));
		HashMap<Node, Integer> lala = new HashMap<Node, Integer>();
		lala.put(one, 1);
		lala.put(two, 2);
		System.out.println(lala.toString());
		Node three = one.neighbours(BaseRobot.Direction.NE);
		System.out.println(three.toString());
		System.out.println(lala.containsKey(three));
		
		System.out.println(one.hashCode());
		System.out.println(two.hashCode());
		System.out.println(three.hashCode()); 
	}

Ausgabe:
true
{1/2=1, 2/3=2}
2/3
false
3
5
5

also three hat nach neighbours() x = 2 und y = 2
und two und three haben den selben hashCode...
und equals müsste ja dann auch true liefern weil ichs ja überladen hab, wie du oben sehen kannst.

darum versteh ich einfach nicht warum er false zurückgibt.

na vllt. weiß es ja jemand. danke im voraus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
S HashMap containsKey liefert immer false zurück Allgemeine Java-Themen 15
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
T HashMap values Bearbeitung Allgemeine Java-Themen 4
T Hashmap Values Bearbeitung Allgemeine Java-Themen 1
JavaJakob22 Bestimmte HashMap importieren Allgemeine Java-Themen 4
killig HashMap mit if-Anweisung überprüfen Allgemeine Java-Themen 4
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
L HashMap Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
B HashMap Duplikate Allgemeine Java-Themen 4
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Tabelle aus CSV, 2 dimensionale HashMap? Allgemeine Java-Themen 4
D Mit Java PHP hashmap lesen Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
X JSONObject auslesen und in HashMap hinterlegen Allgemeine Java-Themen 16
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
JavaWolf165 JsonObject in HashMap umwandeln Allgemeine Java-Themen 16
R ArrayList und HashMap Allgemeine Java-Themen 7
L Assoziatives Datenfeld, schneller wie Hashmap Allgemeine Java-Themen 35
G Methoden HashMap speichert unter falschen Schlüsseln Allgemeine Java-Themen 6
D Verschachtelte HashMap initializieren Allgemeine Java-Themen 1
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
R Hierarchie mit HashMap darstellen Allgemeine Java-Themen 19
D Datentypen HashCollision in HashMap Allgemeine Java-Themen 3
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B Userdaten in Hashmap speichern - Servlet Allgemeine Java-Themen 6
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
M Füllfaktor einer Hashmap Allgemeine Java-Themen 7
D Datentypen HashMap Allgemeine Java-Themen 5
R Collections Performance einer HashMap Allgemeine Java-Themen 26
C LinkedList und ArrayList in HashMap Allgemeine Java-Themen 4
T Erste Schritte HashMap<String, int> Allgemeine Java-Themen 2
K Hashmap sortieren Allgemeine Java-Themen 6
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
K HashMap sorting verhindern Allgemeine Java-Themen 10
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
L HashMap mit Enum Keys Allgemeine Java-Themen 3
J Array als Schlüssel für HashMap Allgemeine Java-Themen 6
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
V Hashmap-Frage Allgemeine Java-Themen 3
M HashMap - Ich bin verwirrt Allgemeine Java-Themen 3
H2SO3- multiple Hashmap Allgemeine Java-Themen 5
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J NullPointerException mit HashMap Allgemeine Java-Themen 2
V Probleme mit eigener Hashmap Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
I HashMap Problem... Allgemeine Java-Themen 3
C HashMap Allgemeine Java-Themen 12
Daniel_L Map/HashMap - Reihenfolge von Einträgen Allgemeine Java-Themen 4
L HashMap Key Reihenfolge umkehren Allgemeine Java-Themen 8
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
J Inhalt von HashMap vergleichen Allgemeine Java-Themen 3
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
T Hashmap füllen mit rs sortierung Allgemeine Java-Themen 9
D HashMap sortieren Allgemeine Java-Themen 2
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
D HashMap Problem Allgemeine Java-Themen 14
G Runnables aus Hashmap starten Allgemeine Java-Themen 4
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G HashMap key ändern Allgemeine Java-Themen 5
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
S Problem mit Hashmap Allgemeine Java-Themen 2
G Datei einlesen und in HashMap verarbeiten Allgemeine Java-Themen 3
E Auslesen aus Hashmap Allgemeine Java-Themen 3
P HashMap mit mehreren gleichen keys Allgemeine Java-Themen 4
alexpetri hashmap bästpractice Allgemeine Java-Themen 4
J HashMap mit Webservice realisierbar? Allgemeine Java-Themen 4
ARadauer hashmap vs hastable Allgemeine Java-Themen 5
T HashMap#values Reihenfolge Allgemeine Java-Themen 13
M ArrayList sortieren - HashMap mit sort_id vorhanden Allgemeine Java-Themen 2
L Wie kann ich eine HashMap abspeichern? Allgemeine Java-Themen 3
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
P List in Hashmap schreiben Allgemeine Java-Themen 5
M Threads in einer Hashmap Allgemeine Java-Themen 5
P HashMap an 2 Stellen veränderbar Allgemeine Java-Themen 13
P HashMap auflösen Allgemeine Java-Themen 9
MQue HashMap durchlaufen Allgemeine Java-Themen 2
MQue HashMap Allgemeine Java-Themen 2
M HashMap kommt beim Löschen aus dem Tritt Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 9
MQue Sichtbarkeit/HashMap/NullPointerexception Allgemeine Java-Themen 2
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Klasse in HashMap speichern Allgemeine Java-Themen 3
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
M HashMap sortiert Allgemeine Java-Themen 6
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben