java - 如何使我的 HashMap 按预期工作?

标签 java hashmap

假设有一个简单的类:

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));
}

并得到 truefalse分别在第一种和第二种情况下。到底是怎么回事?这张 map 比较的是哈希值而不是值吗?如何使示例在两种情况下都返回 true?

最佳答案

由于您使用的是 HashMap,而不是 TreeMap,因此您需要覆盖 hashCodeequals,而不是 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/

相关文章:

java - Android to servlet 图片上传保存到服务器

java - 如何使用Android手机获取系统的IP地址?

java - 文件中 HashMap 字符串出现次数 [JAVA]

c++ - 我如何实现这个伪代码?

关于 ArrayList<Integer>[] x 的 Java 问题

java - 将 spring-mvc AbstractExcelView 与已创建的文档一起使用

java - 什么是java调用

java - 在枚举中添加映射并将键和值放入其中?

rust - 如何在不使用 for 循环的情况下将元组 Vec 中的两个嵌套 HashMap 转换?

python - 用于收集 numpy 数组的高效查找表