0

在我的程序中,我有一个名为 Cell 的类,定义如下:

public class Cell {
    private int x;
    private int y;

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

    @Override
    public boolean equals (Object o) {
        boolean result = false;
        if (o instanceof Cell) {
            Cell other = (Cell) o;
            result = (this.x == other.x && this.y == other.y)
        }
        return result;
    }

    @Override        
    public int hashCode() {
        int result = x;
        result = 31 * result + y;
        return result;
    }
}

我有一个 Grid 类,就像这样(许多方法被删掉并简化了变量名):

public class Grid {
    private Set<Cell> cellArray;

    public Grid() {
        cellArray = new HashSet<Cell>();
    }

    public Set<Cell> getCellArray() {
        return cellArray;
    }

    public void addCellArray(Cell cell) {
        cellArray.add(cell)
    }
}

在我的代码主体中,我采用了一个网格对象,如下所示:

public class Controller {
    private Grid grid;
    public Controller (Grid grid) (
        this.grid = grid;

然后,我有一系列看起来像这样的循环:

private set<Cell> cellArray = grid.getCellArray();

boolean endLoop = false;
 do {
    x = randomGenerator.nextInt(10);
    y = randomGenerator.nextInt(10);

    for (int i = 0; i < length; i++) {
        if (cellArray.contains(new Cell(x, y+i))) {
            continue;
        }
    }
    for (int j = 0; j < length; j++) {
        cellArray.add(new Cell(x, y+i));
    }
    endLoop = true;
} while(!endLoop);

我知道这是一个非常混乱的情况,正在进行太多的实例化(如果有人有使其更清洁的指针,请随时指出它们) - 但是,主要问题是第一个 for 循环旨在检查 cellArray 是否包含项目 - 它似乎没有这样做。

没有错误消息,没有空指针或类似的东西。我已经尝试过调试它并看到它比较了具有相同 x 和 y 值的两个单元格,而没有继续执行 continue 语句以再次启动 do while 循环。

我假设这是因为即使它们具有相同的值,它们也是不同的“对象”,因此不会以相同的方式返回。

如果它们的值相同,我该如何解决这个问题并让它们彼此等同?

4

1 回答 1

2

您的continue语句继续内部for循环(这在这里毫无用处)。您可能希望继续外循环:continue outerLoop;,标签outerLoop:放在do {.

正如Java API所述,该contains方法应该依赖于您的equals方法,因此对象相等应该按照您的预期工作。

于 2013-05-01T10:23:23.487 回答