7

我有一个HashMap<Point, T>数据结构,其中包含映射到类的其他实例的几个点T。当我的类像这样实例化时,这个映射被赋予了一些默认值:

T t1 = new T();
T t2 = new T();
Point p1 = new Point(0, 1);
Point p2 = new Point(0, 2);

HashMap<Point, T> map = new HashMap<Point, T>();
static {
    map.put(p1, t1);
    map.put(p2, t2);
}

在我的代码中,我将接收包含一个x和一个y值的事件。当我收到其中一个事件时,我正在尝试使用传递的 and 创建一个新对象Point,然后从映射中检索值,如下所示:xy

Point p = new Point(event.getX(), event.getY); // Assume (x, y) = (0, 1) (p1)
if(p.equals(p1)    
    T t = map.get(p);

虽然在这种情况下p等于(使用( x p1, y) = (0, 1) 我nullmap.以防止碰撞。hashCode()Point (Point2D)equals

我的问题是:如何从map使用新实例中检索值p?是否有另一种适合该用例的数据结构?

我想我可以使用toString()或其他一些映射,HashMap<String, T>或者我可能会扩展Point类和Override方法hashCode()以适应我的目的。不过,如果有一种更简洁的方式,我很想听听这些方式。

4

4 回答 4

6

根据Java 文档

如果根据方法两个对象相等equals(Object),则对两个对象中的每一个调用该hashCode方法必须产生相同的整数结果。

在您的情况下,两个Point对象似乎相等(根据equals方法),但它们的哈希码不同。这意味着您需要修复您的equalshashCode功能以彼此保持一致。

于 2013-01-29T18:54:00.403 回答
2

您可以尝试编写一个自包含的示例,如下所示,我们可以运行

Map<Point, String> map = new LinkedHashMap<>();
for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++)
        map.put(new Point(i, j), "(" + i + "," + j + ")");

// test the map
int misMatches = 0;
for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++) {
        String expected = "(" + i + "," + j + ")";
        String text = map.get(new Point(i, j));
        if (!expected.equals(text)) {
            System.err.println("Expected <" + expected + "> but got <" + text + ">");
            misMatches++;
        }
    }
System.out.println(misMatches + " mis-matches found.");

印刷

0 mis-matches found.
于 2013-01-29T18:59:53.933 回答
2

我认为 Point 类的 equals() 或 hashcode() 没有任何问题。试试这个:

public static void main(String args[]) {

        Map<Point, Integer> map = new HashMap<Point, Integer>();
        Point p1 = new Point(0, 1);
        Point p2 = new Point(0, 2);
        map.put(p1,1);
        map.put(p2,2);
        Point p = new Point(0, 1);
        if(p.equals(p1)){
            System.out.println(map.get(p));
        }
        else{
            System.out.println("not");
        }



    }

它正在产生正确的结果。

我猜你没有正确初始化地图。

于 2013-01-29T19:15:27.033 回答
1

hashCode() 应该使用与 equals() 相同的属性以保持一致。

另请参阅:在 Java 中覆盖 equals 和 hashCode 时应考虑哪些问题?

于 2013-01-29T18:50:18.780 回答