HashMap.containsKey(key)无法找到键,自定义类用作键类型

时间:2017-03-23 23:54:40

标签: java dictionary hashmap equals

TL; DR:我用自己的“Pair”类对象创建了一个hashmap对象,用作Keys。当我使用hashmap.containsKey(Pair)时,它无法找到密钥。

我有一个名为Pair的类,代码如下所示。它应该是两个对象的容器。第一个对象可以是任何类型,而第二个对象必须是整数。这不是很好的设计,但我这样编码,所以我可以在我的程序中将该类重用于其他目的。

import java.util.ArrayList;

public class Pair<L> {
    private L left;
    private int right;

    public Pair(L left, int right) {
        this.left = left;
        this.right = right;
    }

    public L getLeft() { return left; }
    public int getRight() { return right; }

    public void ToString() {
        System.out.println(left + "," + right);
    }

    public boolean equals(Pair p) {
        return (this.getLeft().equals(p.getLeft()) && this.getRight() == p.getRight());
    }

    public ArrayList<Pair> neighbors(int rowLimit, int ColumnLimit) {
        ArrayList<Pair> neighbors = new ArrayList<Pair>();
        Pair neighborL;
        Pair neighborR;
        Pair neighborU;
        Pair neighborD;
        if (((int)this.left-1 >= 0)) {
            neighborU = new Pair((int)this.left-1, this.right);
//          neighborU.ToString();
            neighbors.add(neighborU);
        }
        if ((int)this.left+1 < rowLimit) {
            neighborD = new Pair((int)this.left+1, this.right);
//          neighborD.ToString();
            neighbors.add(neighborD);
        }
        if ((int)this.right-1 >= 0) {
            neighborL = new Pair((int)this.left, this.right-1);
//          neighborL.ToString();
            neighbors.add(neighborL);
        }
        if ((int)this.right+1 < ColumnLimit) {
            neighborR = new Pair((int)this.left, this.right+1);
//          neighborR.ToString();
            neighbors.add(neighborR);
        }
        return neighbors;
    }
}

我将Pairs存储为像这样的哈希映射中的键:

Map<Pair, Integer> costSoFar = new HashMap<Pair, Integer>();
costSoFar.put(sLocale, 0);

当我运行下面的行时,也就是说,如果键不在hashmap中:

if (!costSoFar.containsKey(next))

它评估为true,即使我知道密钥在那里,因为我已通过调试检查。 The Key is Pair(4,1) And the Key I'm looking for is Pair(4,1)

如果有人可以帮助清理为什么hashmap没有识别密钥,那么我们将非常感激。也许我的平等方法还没有达到标准?

2 个答案:

答案 0 :(得分:1)

如果L似乎也是int,你为什么要使用Generics?

替换你的等于:

public boolean equals(Object o) {
    if (o instanceof Pair){
         Pair p = (Pair)o;
         return (this.getLeft().equals(p.getLeft()) && this.getRight() == p.getRight());
    }
    return false;
}

实现int hashCode():

public int hashCode() {
    return this.getLeft() * 31 + this.getRight();
}

答案 1 :(得分:0)

containsKey(Object)中的方法java.util.HashMap使用调用java.util.HashMap.getEntry(Object)的{​​{1}}来获取Key的hashCode并使用它来检索对象。您需要覆盖hashCode()才能使代码正常运行。