user915496
user915496

Reputation:

How to make the java HashSet / HashMap work with any Object?

Is it possible to make HashSet work with any Object ?? I tried to make the Object implement Comparable but it didn't help

import java.util.HashSet;
public class TestHashSet {
    public static void main(String[] args) {
        class Triple {
            int a, b, c;

            Triple(int aa, int bb, int cc) {
                a = aa;
                b = bb;
                c = cc;
            }
        }
        HashSet<Triple> H = new HashSet<Triple>();
        H.add(new Triple(1, 2, 3));
        System.out.println(H.contains(new Triple(1, 2, 3)));//Output is false
    }
}

Upvotes: 0

Views: 2916

Answers (3)

user207421
user207421

Reputation: 310980

It already does work with any object. I suggest you need to read the Javadoc instead of guessing about the requirements.

Upvotes: -1

Michael Berry
Michael Berry

Reputation: 72344

For it to work properly you'll need to implement equals() and hashcode() and you'll also need to make sure they're implemented properly, following the contract set out in the Javadoc (it's perfectly possible to implement them not following this contract but you'll get bizarre results with potentially hard to track down bugs!)

See here for a description.

Upvotes: 1

ratchet freak
ratchet freak

Reputation: 48216

you need to implement equals(Object) and hashCode()

ensure that the hashcodes are equal when the objects are equal

in your example:

class Triple {
    int a, b, c;

    Triple(int aa, int bb, int cc) {
        a = aa;
        b = bb;
        c = cc;
    }

    public boolean equals(Object arg){
        if(this==arg)return true;
        if(arg==null)return false;
        if(arg instanceof Triple){
            Triple other = (Triple)arg;
            return this.a==other.a && this.b==other.b && this.c==other.c;
        }
        return false;
    }

    public int hashCode(){
      int res=5;
      res = res*17 + a;
      res = res*17 + b;
      res = res*17 + c;
      //any other combination is valid as long as it includes only constants, a, b and c

      return res;
    }

}

Upvotes: 5

Related Questions