Java Hashtable .containsKey(String key) ist die Rückgabe true, auch wenn die Streicher und die hashcodes Verschieden sind... Wie?
Ich bin derzeit mit einigen Problemen mit meiner Hashtable in java, wo FEightPuzzle ist eine Klasse die ich erstellt habe.
In meiner Klasse, ich habe eine Zeichenkette, die die Speicherung der Schlüssel für jede Instanz. Nun bei meinem Programm, wenn ich check in der Hashtable für die doppelte Instanzen, die ich manchmal "finden", wenn wirklich die gefunden, die sind anders.
Nehmen, wenn ich zum Beispiel call-bol.containsKey(Strom.Schlüssel), wo bol ist ein HT und Strom FEightPuzzle.
Wenn dies wahr ist, überprüfe ich die Werte der Schlüssel, und Sie sind
current.key =
"8 14 11 0 6 12 13 1 10 4 5 9 15 2 3 7"
bol.get(current.key).key =
"12 8 4 0 13 9 5 1 14 10 6 2 15 11 7 3"
Werte
current.key.hashCode() = -950607924
bol.get(current.key).key.hashCode() = -1856769042
Tut mir Leid, Sie zu stören, aber dieses problem ist wirklich immer zu mir, und es war das Letzte, was ich erwartet heute Abend um ehrlich zu sein (Sie nicht Liebe)... Irgendwelche Tipps oder Antworten würde sehr geschätzt werden!
- Als seitliche Anmerkung, die
Hashtable
ist veraltet, verwenden Sie besser eineHashMap
(oderConcurrentHashMap
wenn Sie brauchen, thread safety). - Ist es möglich, dass Sie ändern die Schlüssel der Elemente, die bereits Hinzugefügt, um Ihre Karte (ohne das entfernen und neu-hinzufügen zu halten, Karte Integrität intakt)?
- Gute Frage, aber Nein, ich glaube nicht, dass es möglich ist. Eine Instanz ist-Zustand eingestellt ist, wenn es initialisiert wird, werden keine änderungen vorgenommen, dann - und das ist, wo der Schlüssel ist aus
- Können Sie nach dem code, wo Sie das hinzufügen der Objekte zu den HT?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nachgelesen Ihre Frage, und wie ich es verstehe, haben Sie Folgendes problem:
Tun Sie
um zu überprüfen, ob
current
ist bereits inbol
.Wenn es den Wert true zurück, erwarten Sie, dass der Wert zugeordnet, indem
current.key
soll jacurrent
, aber als Sie Ihre hash-codes anzuzeigen, ist es nicht.Das problem ist wahrscheinlich eine der folgenden:
Sie nicht setzen das puzzle-Objekt in der hashtable-korrekt in den ersten Platz.
Sollten Sie tun
Ändern Sie die Taste, wenn das puzzle war in der Karte. DIES IST NICHT ERLAUBT.
Nachdem Sie Hinzugefügt haben, wird der Eintrag in die Karte, können Sie nicht den Schlüssel ändern, ohne das entfernen /Wiedereinsetzen der Zuordnung.
Hashtable wird, sucht das Objekt, basierend auf dem Schlüssel, den Sie beim einfügen.
Haben Sie versehentlich sofern die gleichen Schlüssel für mehrere verschiedene puzzle-Objekte (in dem Fall eine
put
überschreibt eine Vorherige)Ein Vorschlag wäre, lassen Sie FEightPuzzle überschreiben Sie hashCode und equals und Verwendung eines HashSet statt einer Hashtable.
Ich denke, Sie sind Missverständnis, was
Hashtable
tut. Es bildet Schlüssel auf Werte. So ruftget(key)
auf Ihrem Schlüssel ist wieder der Wert, den Sie mitput(key, value)
. Nun, wenn Sie immer setzen den gleichen Wert wie der Schlüssel, den Sie sollten erwarten, dass die gleiche Sache, aber in diesem Fall alles, was Sie brauchen, ist einHashSet
. Wenn Sie setzen die gleichen Werte für die verschiedenen Schlüsseln, wird es ermöglichen, dass. Nur die keys sind einmalig in einHashtable
(undHashMap
ist das gleiche).