Java: мой поиск HashMap завершается неудачно, потому что он выполняется по ССЫЛКЕ, а не по VALUE. Как мне исправить? - PullRequest
0 голосов
/ 26 апреля 2018

Я использую структуру, содержащую 3 целых числа, в качестве ключа к моей карте. Кажется, мой HashMap ищет ключи, основанные на REFERENCE, а не ключи, основанные на VALUE. Есть ли способ это исправить? Ниже Я ожидаю, что b и d будут правдой!

public class Triple{
    public int kid;
    public int x;
    public int y;
    public Triple(int a, int b, int c){
        kid=a;
        x=b;
        y=c;
    }

    public Triple(Triple notAcopy, int next, boolean reverse){
        kid=notAcopy.kid;
        x=notAcopy.x + next;
        if (reverse)
            y=notAcopy.y-next;
        else
            y=notAcopy.y+next;
    }

    public String toString(){
        return "("+kid+", "+x+", "+y+") ";
    }
}

    HashMap<Triple, Boolean> forward;
    forward = new HashMap<Triple, Boolean>();
    Triple a = new Triple(1,4,10);
    Triple b = new Triple(1,4,10);
    Triple c = new Triple(1,5,11);
    Triple d = new Triple(1,5,11);
    forward.put(a, true);
    forward.put(c, true);

    System.out.println("a\t"+forward.containsKey(a));
    System.out.println("b\t"+forward.containsKey(b));
    System.out.println("c\t"+forward.containsKey(c));
    System.out.println("d\t"+forward.containsKey(d));

Output:
a   true
b   false
c   true
d   false

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

для потомков: Спасибо Тимиру. Это исправлено

For those reading at home, this fixed it
@Override
public int hashCode(){
    return kid & x & y;
}

@Override
public boolean equals(Object o){
    Triple t = (Triple) o;
    boolean result = true;
    if (kid != t.kid || x != t.x || y != t.y)   result = false;
    return result;
}
0 голосов
/ 26 апреля 2018

Переопределить хэш-код и равно в классе Triple.

...