When we put a class Object (that has say three data members) in a hashtable, how can I prevent putting another entry into the hash table whose key has the same three data members ? Cos I am guessing this will be a new object. So hashtable.containsKey() will return false even when there is a key (this class object) that has the very same data members as the one that is waiting to be inserted.
More clearly: I have a class like
class Triplet {
private Curr curr;
private Prev prev;
private Next next;
}
I have a hashtable structure like:
Hashtable<Triplet, Integer> table = new Hashtable<Triplet, Integer>();
When I do:
if(!table.containsKey(triplet_to_inserted))
table.put(triplet, new Integer(0));
will this insert a duplicate even if the table contains a triplet that already has the same data members ? That is: triplet_to_be_inserted.curr, triplet_to_be_inserted.next and triplet_to_be_inserted.prev If yes, how to prevent this ?
Also, for any entry to be inserted, will containsKey() ever return true at all ? How to work around this problem ?
Thanks.
All classes that have instances used as keys in a hash-like data structure must correctly implement the equals
and hashCode
methods. Brian Goetz has a great article on this from a while back.
Without knowing the structure of Curr
, Prev
and Next
and exact example is difficult, but assuming they are not null and have sensible hashCode
implementations, you could do something like this:
public boolean equals(Object obj) {
if (!(obj instanceof Triplet)) {
return false;
} else {
Triplet that = (Triplet)obj;
return this.curr.equals(that.curr) &&
this.next.equals(that.next) &&
this.prev.equals(that.prev);
}
}
public int hashCode() {
int hash = this.curr.hashCode();
hash = hash * 31 + this.next.hashCode();
hash = hash * 31 + this.prev.hashCode();
return hash;
}
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