我正在尝试使用哈希表来存储和检索矩阵索引的值。
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)))
时,尽管那里显然有一个值,但我总是收到错误的消息?
我觉得我在身份方面缺少一些基本知识。
答案 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
方法