Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Arraylist equals始终返回true_Java - Fatal编程技术网

Java Arraylist equals始终返回true

Java Arraylist equals始终返回true,java,Java,我的目标是制作Slenderman的2D棋盘游戏版本,但我在equals和hashCode方法方面遇到了麻烦 这里我有一个障碍物的数组列表(x和y坐标,玩家不能踩上),我还想生成另一个由坐标组成的数组列表,我可以在其中放置文件。(在游戏中,玩家必须找到这些文件才能获胜。) 我试图通过检查特定位置的周围环境来制作纸质清单,因为棋盘上不应该有任何纸张,玩家够不到 我的确切问题是,这个循环将所有障碍位置都放在了纸上,我不知道为什么 for (Position p : obstacleList) {

我的目标是制作Slenderman的2D棋盘游戏版本,但我在equals和hashCode方法方面遇到了麻烦

这里我有一个障碍物的数组列表(x和y坐标,玩家不能踩上),我还想生成另一个由坐标组成的数组列表,我可以在其中放置文件。(在游戏中,玩家必须找到这些文件才能获胜。) 我试图通过检查特定位置的周围环境来制作纸质清单,因为棋盘上不应该有任何纸张,玩家够不到

我的确切问题是,这个循环将所有障碍位置都放在了纸上,我不知道为什么

for (Position p : obstacleList) {
            Position p1 = new Position (p.x - 46, p.y);
            Position p2 = new Position (p.x + 46, p.y);
            Position p3 = new Position (p.x, p.y - 46);
            Position p4 = new Position (p.x, p.y + 46);

            label :
            {
                if (obstacleList.contains(p1) && obstacleList.contains(p2) && obstacleList.contains(p3) && obstacleList.contains(p4)) {
                    break label;
                } else if (p1.x < 0 && obstacleList.contains(p3) && obstacleList.contains(p4)) {
                    break label;
                } else if (p2.x > WIDTH && obstacleList.contains(p3) && obstacleList.contains(p4)) {
                    break label;
                } else if (p3.y < 0 && obstacleList.contains(p1) && obstacleList.contains(p2)) {
                    break label;
                } else if (p4.y > HEIGHT && obstacleList.contains(p1) && obstacleList.contains(p2)) {
                    break label;
                } else paperList.add(p);
            }
        }

break标签语句没有脱离循环。为此,您需要通过将
标签:
移动到
for
语句的前面来标记循环。

您是否已经使用调试器对代码进行了单步调试?我怎么知道为什么总是这样。我不知道禁忌列表里有什么。很难帮助你。没有所有必要的信息…只是想澄清一下-您是否打算在纸质列表中包含所有未被其他4个障碍物包围的障碍物的坐标?(假设边缘像一个障碍物?)从您发布的代码中,看起来您可以简单地删除
标签
标签,还可以删除所有
中断标签语句。一个
if
块可以是空的。这实际上对我来说应该是可行的,至少对于那些不在边缘的块。我认为边缘代码是不对的。你能不能再发一些代码来说明你是怎么称呼它的?(我同意实施可能会更好,正如阿布拉所说)谢谢你,就这样!我完全移除了标签,现在它工作正常。如果你完全移除了标签,那么这不是这个答案所建议的。我很想看看你到底做了些什么使它正常工作@PeterHull完全移除标签(因此使用
break;
而不是
break标签;
将标签放在
for
语句的前面)具有完全相同的效果,因为简单的
break语句将应用于最近的封闭循环,即
for
循环。或者,OP也可以只放一个空语句“
”而不是break。
public class Position{
    public int x;
    public int y;

@Override
    public int hashCode() {
        return Objects.hash(x, y);
    }

@Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (!(obj instanceof Position)) return false;
        if (getClass() != obj.getClass()) return false;
        if (obj == this) return true;

        Position position= (Position) obj;
        return x == position.x && y == position.y;
    }
}