我正在尝试使用哈希表,当我试图搜索一个对象时,我没有看到该对象,但是如果我打印它我就能看到它。
节点类:
public class Node {
int x;
int y;
public Node() {
this.x=0;
this.y=0;
}
public Node(int x,int y) {
this.x=x;
this.y=y;
}
public String toString(){
return "(Node: x,y="+Integer.toString(x)+","+Integer.toString(y)+")";
}
}
主类:
public class GridWalk {
static Hashtable <Node, Integer> myMap;
static Stack<Node> nodes;
public static void main(String[] args) {
myMap = new Hashtable<Node,Integer>();
nodes=new Stack<Node>();
Node start=new Node(0,0);
Node new1= new Node(100,100);
myMap.put(new1,new Integer(1));
Node new2=new Node (100,100);
System.out.println("Already there ? huh: "+new2.toString()+" at "+myMap.get(new2));
}
}
我在打印行时得到NULL。知道为什么吗?
答案 0 :(得分:4)
您需要在Node类中覆盖并实现equals
方法。 java.lang.Object
的默认实现仅比较引用的相等性,这在您的情况下是不合适的。
Node new1 = new Node(100, 100);
Node new2 = new Node(100, 100);
System.out.println(new1.equals(new2)); // Your current code will print false
HashMap依赖于equals
和hashCode
方法的正确实现,以便正确运行。您应该实现反映对象逻辑的equals
方法。类似的东西:
public boolean equals(Object o) {
if(this == o) return true;
final Node other = (Node) o;
return ((getX() == o.getX()) && (getY() == o.getY());
}
您可能还想在hashCode()
对象上实施Node
方法。