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,即使我知道密钥在那里,因为我已通过调试检查。
如果有人可以帮助清理为什么hashmap没有识别密钥,那么我们将非常感激。也许我的平等方法还没有达到标准?
答案 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()
才能使代码正常运行。