Ich arbeite gerade an einem TD-Spiel mit einem Karteneditor. Jetzt können Sie diese Karten natürlich speichern und laden (oder zumindest können). Problem ist: irgendwann rufe ich .get()
auf einem HashMap
. Leider sind die Schlüssel, die (logisch) identisch sein sollten, nicht das gleiche Objekt (in Bezug auf die Referenz), und nach meiner vorherigen Google-Forschung ist das Überschreiben ihrer .equals
Methode nicht ausreichend, da sie immer noch verschiedene Hashes zurückgeben mit .hashCode()
(Ich verifizierte, dass sie unterschiedliche Hashes zurückgeben, während .equals
wahr zurückgibt).
(Auf einer Seite zur Kenntnis, das ist ziemlich verwirrend, da die javadoc von HashMap.get(key)
besagt nur, dass sie gleich sein müssen)HashMap.get() liefert nicht den richtigen Wert, dank "hashCode()"
Insbesondere die HashMap
Instanzen einer Klasse enthält Path
von mir als Schlüssel, und sollte die Rückkehr entsprechende Liste der Feinde (= Wert).
Kurzfassung Path
(ohne Getter etc.):
public class Path
{
private List<Tile> tiles = new ArrayList<>();
@Override
public boolean equals(Object obj) {
//code comparing the two paths
}
@Override
public int hashCode() {
//what I still need to implement. ATM, it returns super.hashCode()
}
}
public class Tile
{
private int x;
private int y;
//constructor
//overrides equals
//getters & some convenience methods
}
Nun, wenn zwei Pfade gleich sind, würde Ich mag sie den gleichen Hash-Code zurück, so dass die HashMap
die richtige Liste liefert der Feinde. (Ich werde sicherstellen, dass nicht zwei identische Pfade hinzugefügt werden können).
Nun meine Frage:
schlagen Sie
- eine externe Bibliothek unter Verwendung eines Hash zu erzeugen
- , dass ich meine eigene Implementierung zur Berechnung eines Hash schreiben, oder
- etwas anderes
?
Beachten Sie, dass ich es vorziehen würde, die HashMap
zu einer anderen Art von Karte zu ändern, wenn das sogar helfen würde, das Problem zu lösen.
Ihre '3)' könnte wahrscheinlich Ihre 'IDE' oder eine' IDE' im Allgemeinen verwenden, um den 'hashcode' zu generieren – SomeJavaGuy
Sie können Ihren Hashcode so einfach oder komplex machen, wie Sie möchten. es ist als eine schnelle "sind diese zwei vage similar" -Kontrolle gedacht - um so viele wild verschiedene Übereinstimmungen wie möglich zu eliminieren, bevor Sie dann in Ihre 'equals'-Methode für diejenigen eintauchen, die den Hashcode-Check überleben. Abhängig von Ihrem System ist 'return tiles.size()' möglicherweise sogar angemessen! –
lohnt sich hinzuzufügen: Ein Fehler, den Leute machen, ist, Hashcode übermäßig komplex zu machen. Es hat keinen Sinn, es zu haben, wenn es nur so kompliziert sein wird wie die "Equals" -Methode. wie ich schon sagte: es ist als "Quick Check" gemeint. –