我试图通过我创建的自定义类从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中获取一个值。
任何帮助都非常感激,因为我完全不知道该怎么做。 :/
答案 0 :(得分:3)
您需要覆盖Coordinates Class中的hashCode()和equals()方法。 看看hashMap如何在Java中工作。它将通过调用equals()方法检查对象是否相等,该方法的默认实现使用&#34; ==&#34;来检查引用。运营商。 在您的情况下,这将是错误的,因此您无法检索预期的值。
答案 1 :(得分:1)
HashMap
的键集会散列其元素并通过散列进行比较。
您需要覆盖Object.hashCode
课程中的Object.equals
和Coordinates
。
当equals
和true
分别等于x
和y
时,您的otherCoordinates.x
方法应返回otherCoordinates.y
。
对于hashCode
它有点棘手,因为你的哈希将基于两个int
,所以你需要找到一种方法来避免弱哈希(即容易重复的哈希)。
您的IDE的样板hashCode
实现功能应该可以帮助您,但您可以进行额外的位移并使用更好的素数种子。
例如在Ecplise中:
Coordinates
班级source
Generate hashCode() and equals()...