2012-03-11 13 views
0

ハッシュテーブルを使用しようとしていますが、オブジェクトを検索しようとしているときにオブジェクトが表示されませんが、印刷すると表示されます。JavaでHashTableを使用する際の問題

ノードクラス:

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を取得しています。どんな考え?

答えて

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の年代を正しく動作させるために、両方のequalshashCode方法の適切な実施に依存しています。オブジェクト論理を反映するequalsメソッドを実装する必要があります。何かのように:

public boolean equals(Object o) { 
    if(this == o) return true; 

    final Node other = (Node) o; 
    return ((getX() == o.getX()) && (getY() == o.getY()); 
} 

また、あなたのNodeオブジェクト上hashCode()メソッドを実装する場合があります。

+5

そして 'hashCode'。 –

+0

だから、メソッドは次のようなものでなければなりません:Boolean equals(Node node1、Node node2)、右? – Ahsan

+0

入手:public boolean equals(Object obj) { \t return(this == obj); } – Ahsan

関連する問題