Как заставить java HashSet / HashMap работать с любым объектом? - PullRequest
0 голосов
/ 27 августа 2011

Можно ли заставить HashSet работать с любым объектом? Я пытался заставить Объект реализовать Сравнимо, но это не помогло

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
    }
}

Ответы [ 3 ]

5 голосов
/ 27 августа 2011

вам нужно реализовать equals(Object) и hashCode()

, чтобы гарантировать, что хэш-коды равны, когда объекты равны

вваш пример:

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;
    }

}
1 голос
/ 27 августа 2011

Чтобы он работал правильно, вам нужно реализовать equals () и hashcode (), а также убедиться, что они реализованы правильно, в соответствии с контрактом, изложенным в Javadoc (это вполне возможно реализовать они не следуют этому контракту, но вы получите странные результаты с потенциально трудными для отслеживания ошибок!)

См. здесь для описания.

0 голосов
/ 28 августа 2011

Он уже работает с любым объектом. Я предлагаю вам прочитать Javadoc, а не гадать о требованиях.

...