HashMap与值

时间:2015-04-25 20:30:28

标签: java android hashmap

我有一个按钮的哈希映射到矩阵中的对应点。例如,在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有什么我想念的吗?或者还有其他方法吗?解决方案的任何链接或方向都会有所帮助。提前谢谢。

3 个答案:

答案 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;
    }
}