I have a HashMap<Vertex, Integer>
called vertexIndexes
. If I iterate through it with this code:
public boolean search(String vertexName){
for (Vertex name: vertexIndexes.keySet()){
String key = name.toString();
String value = vertexIndexes.get(name).toString();
System.out.println(key + " " + value + " "+ (name.hashCode() == vertexName.hashCode()) + " " + name.equals(vertexName));
}
...
}
it produces this output:
Diessen 0 false false
Herrsching 5 false false
Schondorf 2 false false
Greifenberg 3 false false
Stegen 4 false false
Utting 1 false false
Andechs 6 false false
Fischen 7 true true
So you can see, that the Vertex Fischen
is present and the hashCode
and equals
methods work fine. But if I run
vertexIndexes.containsKey("Fischen")
it returns false
.
Why is that? I lose my mind over it.
name.equals(vertexName)
compares a Vertex
to a String
. While your Vertex
class equals
method might return true
when you pass a String
to it, String
's equals
will never return true
when you pass a Vertex
to it.
HashMap
probably tests whether vertexName.equals(name)
, which returns false
.
Change
vertexIndexes.containsKey("Fischen")
to
vertexIndexes.containsKey(new Vertex("Fischen"))
or change the key of your Map
to String
.
BTW, you could have avoided that issue in the first place if you followed the contract of the equals
method that appears in the Javadoc of the Object
class:
• It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
Your equals
implementation is not symmetric.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With