私のプログラムには、次のように定義された 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 にアイテムが含まれているかどうかを確認してください - これを行っていないようです。
エラー メッセージや null ポインターなどはありません。私はそれをデバッグしようとしましたが、do while ループを再び開始するために continue ステートメントに進むことなく、同じ x 値と y 値を持つ 2 つのセルを比較するのを見てきました。
これは、それらが同じ値を持っていても、異なる「オブジェクト」であるため、同じように戻ってこないためだと思います。
これを修正して、それらの値が同じである場合、それらを互いに同等にするにはどうすればよいですか?