Проблемы с использованием HashTable в Java - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь использовать хеш-таблицу, и при поиске объекта я не вижу объект, но я могу увидеть его, если напечатаю.

Класс узла:

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, когда выполняю строку печати.Есть идеи почему?

1 Ответ

4 голосов
/ 11 марта 2012

Вам необходимо переопределить и реализовать метод equals в своем классе Node.Реализация по умолчанию из 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 объекта.

...