在Java中使用HashMaps比较实例时出现问题

时间:2014-10-13 09:53:29

标签: java hashmap instance

我试图通过我创建的自定义类从HashMap获取值。

自定义类:

public class Coordinates {

    private int x;
    private int y;

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

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }

    public boolean isSame(Coordinates coords) {
        if (coords.getX() == this.x && coords.getY() == this.y) {
            return true;
        }
        return false;
    }

    public String getAsString() {
        return "("+this.x+", "+this.y+")";
    }

    public Coordinates getCoords() {
        return this;
    }

}

我有一个名为coordsJCB的HashMap,当我尝试获取JCButton(自定义摇摆按钮)时,它说它无法找到它。

private static HashMap<Coordinates, JCButton> coordsJCB = new HashMap<Coordinates, JCButton>();
coordsJCB.get(coords);

我做了一点调试并注意到了

System.out.println(new Coordinates(2, 3).equals(new Coordinates(2, 3)));

打印假,即使它们是相同的。 我用Google搜索并获得了许多关于覆盖.equals函数的答案。但是这对我没有帮助,因为我不想比较2个'坐标'实例,我需要通过传递一个坐标实例从HashMap中获取一个值。

任何帮助都非常感激,因为我完全不知道该怎么做。 :/

2 个答案:

答案 0 :(得分:3)

您需要覆盖Coordinates Class中的hashCode()和equals()方法。 看看hashMap如何在Java中工作。它将通过调用equals()方法检查对象是否相等,该方法的默认实现使用&#34; ==&#34;来检查引用。运营商。 在您的情况下,这将是错误的,因此您无法检索预期的值。

答案 1 :(得分:1)

HashMap的键集会散列其元素并通过散列进行比较。

您需要覆盖Object.hashCode课程中的Object.equalsCoordinates

equalstrue分别等于xy时,您的otherCoordinates.x方法应返回otherCoordinates.y

对于hashCode它有点棘手,因为你的哈希将基于两个int,所以你需要找到一种方法来避免弱哈希(即容易重复的哈希)。

您的IDE的样板hashCode实现功能应该可以帮助您,但您可以进行额外的位移并使用更好的素数种子。

例如在Ecplise中:

  • 右键点击Coordinates班级
  • 点击source
  • 点击Generate hashCode() and equals()...