我有一个按钮的哈希映射到矩阵中的对应点。例如,在3X3矩阵中,btn0为(0,0),依此类推。该点是一个带有2个坐标变量的int类。我的Hashmap如下所示:
public final static HashMap<Button, Point> buttonPoint = new HashMap<Button, Point>();
buttonPoint.put(btn0, new Point(0,0));
buttonPoint.put(btn1, new Point(0,1));
buttonPoint.put(btn2, new Point(0,2));
buttonPoint.put(btn3, new Point(1,0));
...
我进行了一些计算并提出了一个观点(1,0)。现在我想从这些坐标中获取按钮。我做了以下事情:
Button selectedButton = null;
for(java.util.Map.Entry<Button, Point> entry : buttonPoint.entrySet()){
if(Objects.equals(selectedPoint, entry.getValue())){
selectedButton=entry.getKey();
}
}
但selectedButton仍为null。我调试了代码,我发现迭代中某些点的值是相等的,但if条件永远不会变为真。关于Hashmaps有什么我想念的吗?或者还有其他方法吗?解决方案的任何链接或方向都会有所帮助。提前谢谢。
答案 0 :(得分:5)
如果您想从坐标获取按钮,使用Map<Button, Point>
不是一个好的解决方案。您应该使用Map<Point, Button>
代替。这样,你需要在给定点获得按钮
Button b = map.get(point);
此操作在恒定时间内运行。
在这两种情况下,您都需要覆盖equals()
中的hashCode()
和Point
。否则,一个点永远不会等于任何其他点。
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o == this) {
return true;
}
if (o.getClass() != Point.class) {
return false;
}
Point other = (Point) o;
return other.x == this.x && other.y == this.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
答案 1 :(得分:1)
HashMap<Button, Point> buttonPoint = new HashMap<>();
Collection<Point> values = buttonPoint.values();
for(Point p: values){
if(p.x == selectedPoint.x && p.y== selectedPoint.y){
//code
}
}
答案 2 :(得分:-1)
即使我建议将@JB Nizet的答案看作是一个更好的approch,解决你的问题你可以改变
Button selectedButton = null;
for(java.util.Map.Entry<Button, Point> entry : buttonPoint.entrySet()){
if(Objects.equals(selectedPoint, entry.getValue())){
selectedButton=entry.getKey();
}
}
通过
Button selectedButton = null;
for(java.util.Map.Entry<Button, Point> entry : buttonPoint.entrySet()){
if(entry.getValue().equals(selectedPoint)){
selectedButton=entry.getKey();
break;
}
}