ここでは、私のタイル配列の配列 "arr"を作成してそれにいくつかの変更を加えたいと思っていますが、問題が発生したのは元の配列の "タイル"にも適用されます(0120)。コピーされた配列のみを変更すると元の配列が変更されるのはなぜですか?
public class Board {
private final int [][] tiles;
// construct a board from an n-by-n array of blocks
// (where blocks[i][j] = block in row i, column j)
public Board(int[][] blocks) {
tiles = blocks;
}// all neighboring boards
public Iterable<Board> neighbors() {
Queue<Board> q = new LinkedList<>();
int [][] arr = tiles;
// do stuff
if (y+1 < n) {
int t = arr[x][y];
arr[x][y] = arr[x][y+1];
arr[x][y+1] = t;
Board br = new Board(arr);
if(!this.equals(br)) {
q.add(new Board(arr));
}
}
return q;
}
}
ありがとうございました
[Javaが「参照渡し」または「渡し渡し」の可能性がありますか?](http://stackoverflow.com/questions/) 40434/is-java-pass-by-valueによる値渡し) – Ravi
この割り当てを行うと、配列がメソッド引数 –
として渡されないため、これは参照渡しまたは値渡しと重複しません'int [] [] arr = tiles;'配列のコピーを作成せず、別のポインタを持つ同じものを指すだけです。実際に新しい配列( 'new'キーワードを使用して)を作成し、タイルを繰り返して、各項目を新しい配列に割り当てる必要があります。 'System.arraycopy'を使うこともできます。https://www.tutorialspoint.com/java/lang/system_arraycopy.htm –