将点用作HashTables的键始终返回Null

时间:2020-02-29 02:03:23

标签: java data-structures

我正在尝试使用哈希表来存储和检索矩阵索引的值。

Hashtable<Point, Integer> sparseMatrix = new Hashtable<Point, Integer>();

每个点都有一个x和一个y,以及toString的覆盖函数以使其可理解。

public class Point {

    int x, y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int[] pos() {
        return new int[] {x, y};
    }

    public int[] reverse() {
        return new int[] {y, x};
    }

    @Override
    public String toString() { 
        return String.format(x + "," + y); 
    } 

}

当您打印出哈希表时,您会得到{1,1=7, 2,1=9, 1,2=8, 3,1=11, 3,2=12, 2,2=10},因此我绝对知道要存储值,并且要按照我想要的方式对键进行格式化。

那么,为什么,当我输入sparseMatrix.contains((new Point(1,1)))时,尽管那里显然有一个值,但我总是收到错误的消息?

我觉得我在身份方面缺少一些基本知识。

2 个答案:

答案 0 :(得分:2)

您需要覆盖hashCode and equals才能使key正常工作。

public int hashCode() {
}

public boolean equals(Object o) {
}

有关详细信息,请阅读Map界面说明here

我修改了您的类以添加方法。您仍然应该阅读它,以确保您了解这些问题。

class Point {

    int x, y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public int hashCode() {
         return x*31 + y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o instanceof Point) { 
           Point p = (Point) o;
           if (p.x == this.x && p.y == this.y) {
               return true;
           }
        }
        return false;
    }
    public int[] pos() {
        return new int[] {x, y};
    }

    public int[] reverse() {
        return new int[] {y, x};
    }

    @Override
    public String toString() { 
        return String.format(x + "," + y); 
    } 
}

答案 1 :(得分:2)

HashTable contains方法检查特定值是否映射到哈希表中的任何键。

语法 HashTable.contains(对象值)

如果要检查对应于key的使用 containsKey方法

语法: HashTable.containsKey(key_element)。

由于您要检查的是与Point相对应的key,请使用HashTable的containsKey方法

相关问题