假设有一个简单的类:
public class Point implements Comparable<Point> {
public int compareTo(Point p) {
if ((p.x == this.x) && (p.y == this.y)) {
return 0;
} else if (((p.x == this.x) && (p.y > this.y)) || p.x > this.x) {
return 1;
} else {
return -1;
}
}
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
还有一个 HashMap
来自 Point
对于某事,比方说Cell
:
cellMap = new HashMap<Point, Cell>();
然后填写cellMap
如下:
for (int x = -width; x <= width; x++) {
for (int y = -height; y <= height; y++) {
final Point pt = new Point(x,y);
cellMap.put(pt, new Cell());
}
}
}
然后一个人做了类似(微不足道的)这样的事情:
for (Point pt : cellMap.keySet()) {
System.out.println(cellMap.containsKey(pt));
Point p = new Point(pt.getX(), pt.getY());
System.out.println(cellMap.containsKey(p));
}
并得到 true
和 false
分别在第一种和第二种情况下。到底是怎么回事?这张 map 比较的是哈希值而不是值吗?如何使示例在两种情况下都返回 true?
最佳答案
由于您使用的是 HashMap
,而不是 TreeMap
,因此您需要覆盖 hashCode
和 equals
,而不是 compareTo
,在你的 Point
类中:
@Override
public int hashCode() {
return 31*x + y;
}
@Override
public bool equals(Object other) {
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof Point)) return false;
Point p = (Point)other;
return x == p.x && y == p.y;
}
关于java - 如何使我的 HashMap 按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17411410/