Re: Collections - Set to prevent duplicating items
On 7/12/2010 2:38 PM, Stefan wrote:
Hello,
I guess my problem is "no-brainer" to some of you, but for now I fell
completely helpless. Here is an easiest example:
package test;
import java.util.*;
class Vertex {
int number;
public Vertex(int number) {
this.number = number;
}
public String toString() {
return number + "";
}
@Override
public boolean equals(Object obj) {
return this.number == ((Vertex) obj).number;
}
}
public class SetTest {
public static void main(String[] args) {
Set vertices = new HashSet();
Vertex a = new Vertex(2);
Vertex b = new Vertex(3);
Vertex c = new Vertex(3);
System.out.println(b.equals(c));
vertices.add(a);
vertices.add(b);
vertices.add(c);
System.out.println(vertices);
}
}
Console prints:
true (b equals c)
[3, 2, 3] (Vertex was added to set althought it equals another Vertex)
"I observed immediately that the malefactor had made one crucial
error in carrying out his fiendish plan: He forgot to override the
hashCode() method when overriding equals(). As any student of the art
of detection knows well, these two are inseparable: Override both, or
override neither, or invoke chaos upon yourself -- as many a resident
of Her Majesty's Gaols can testify tearfully."
"Astounding, Holmes!"
"Elementary, my dear Watson. I also note that this perpetrator is
a particularly clumsy example of the species, having implemented an
equals() that fails miserably if given an argument that is `null', say,
or a reference to anything other than a `Vertex' instance. Like so many
of the criminal underclass, he fails to consider the consequences of his
actions in a wider context than his immediate plot."
"The criminal `underclass', Holmes? Surely you meant `subclass'."
"You're starting to get on my nerves, Watson. Must I uncase my
violin again?"
"I say, Holmes, I believe I'll go out for a bit of a stroll."
--
Eric Sosman
esosman@ieee-dot-org.invalid