Ich habe eine Map in Java so,
private HashMap<String, Object[][]> theMap;
Wenn der Schlüssel ein String ist und der Eintrag etwas entlang der Zeile von ist,
theMap = new HashMap<>();
Object[][] theData = {
{Boolean.FALSE, "Text"}
};
theMap.put("Key1", theData);
Irgendwo entlang der Linie möchte ich prüfen, ob ein Eintrag in der Karte einem anderen Objekt entspricht. Momentan mache ich das so,
Object[][] tempData = {
{Boolean.FALSE, "Text"}
};
for(Object key: entries.keySet()) {
if(entries.get(key).equals(tempData)) {
entries.remove(key);
}
}
Und es funktioniert nicht.
Ich würde den Vergleich lieber mit einem Objekt als mit einer anderen Karte machen. Ich frage mich, was ich mit diesem Vergleich hier falsch mache?
Antworten:
3 für die Antwort № 1Der Grund, warum Sie keine Gleichheit erhalten, ist, dass Arrays erben Object#equals()
die auf der Identität basiert, nicht der inhaltlichen Gleichheit. Sie könnten in Betracht ziehen java.util.Arrays.deepEquals(Object[], Object[])
zu vergleichen.
Das ist die Antwort auf die unmittelbare Frage. Verwenden Sie jedoch ein 2-dimensionales Array von Object
a halten boolean
und ein String
ist wirklich schlechter Codegeruch und zeigt an, dass Sie das, was Sie in das Array einfügen, einkapseln müssen.
1 für die Antwort № 2
Identität vs. Äquivalenz
Bitte vergewissern Sie sich, dass Sie standardmäßig die equals()
Methode von Object
prüft, ob zwei Objektverweise auf dasselbe Objekt verweisen (Identität), was Ihr Code nicht überprüft.
Stattdessen prüft Ihr Code, ob die beiden Objekte (die Werte, die Sie in die Map einfügen) denselben Wert haben (Gleichwertigkeit).
Hier sind zwei Artikel zu diesem Thema:
- Was ist der Unterschied zwischen Identität und Gleichheit bei OOP?
- Gleiche Methode in Java überschreiben
Ich denke, bei diesem speziellen Problem von Ihnen besteht die Lösung aus zwei Schritten:
- Ihre
tempData
undtheData
scheint kein Array zu sein von Elementen des gleichen Typs (es scheint nicht zweidimensional zu sein Array entweder). Stattdessen enthält es einBoolean
Wert und dann einString
Wert. In diesem Fall sollten Sie wirklich denken durch was dieses Ding ist und entwerfe eine Klasse dafür (ich zeige es ein Beispiel unten) - Die Klasse sollte das überschreiben
equals()
(undhashCode()
) Methoden so dass Sie es verwenden könnenequals()
zur Äquivalenzprüfung.
Beachten Sie auch, dass Ihre IDE (z. B. Eclipse
) kann wahrscheinlich eine Vorlage für erstellen equals()
und hashCode()
für dich.
Beispiel: (hier nehme ich an Boolean
stellt eine Bedingung dar und Ihre String
stellt eine Nachricht dar)
class MyRecord {
private Boolean condition;
private String message;
public Boolean getCondition() {
return condition;
}
public void setCondition(Boolean condition) {
this.condition = condition;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((condition == null) ? 0 : condition.hashCode());
result = prime * result
+ ((message == null) ? 0 : message.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyRecord other = (MyRecord) obj;
if (condition == null) {
if (other.condition != null)
return false;
} else if (!condition.equals(other.condition))
return false;
if (message == null) {
if (other.message != null)
return false;
} else if (!message.equals(other.message))
return false;
return true;
}
}