/ / Vergleichen eines Eintrags in einer Karte mit einem Objekt - Java, Wörterbuch

Vergleichen eines Eintrags in einer Karte mit einem Objekt - Java, Wörterbuch

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 № 1

Der 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:

  1. Was ist der Unterschied zwischen Identität und Gleichheit bei OOP?
  2. Gleiche Methode in Java überschreiben

Ich denke, bei diesem speziellen Problem von Ihnen besteht die Lösung aus zwei Schritten:

  1. Ihre tempData und theData scheint kein Array zu sein von Elementen des gleichen Typs (es scheint nicht zweidimensional zu sein Array entweder). Stattdessen enthält es ein Boolean Wert und dann ein String 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)
  2. Die Klasse sollte das überschreiben equals() (und hashCode()) Methoden so dass Sie es verwenden können equals() 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;
}
}