2017-04-02 9 views
0

ここでは、私のタイル配列の配列 "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; 
    } 
} 

ありがとうございました

+0

[Javaが「参照渡し」または「渡し渡し」の可能性がありますか?](http://stackoverflow.com/questions/) 40434/is-java-pass-by-valueによる値渡し) – Ravi

+1

この割り当てを行うと、配列がメソッド引数 –

+0

として渡されないため、これは参照渡しまたは値渡しと重複しません'int [] [] arr = tiles;'配列のコピーを作成せず、別のポインタを持つ同じものを指すだけです。実際に新しい配列( 'new'キーワードを使用して)を作成し、タイルを繰り返して、各項目を新しい配列に割り当てる必要があります。 'System.arraycopy'を使うこともできます。https://www.tutorialspoint.com/java/lang/system_arraycopy.htm –

答えて

1

Java配列はオブジェクトです。 clone()メソッドを使用して配列をコピーすることができます。それは浅いコピーを実行します - あなたのint配列で正常に動作します。

int [][] arr = new int[tiles.length][]; 
for(int i = 0; i < tiles.length; i++) 
    arr[i] = tiles[i].clone(); 
  1. copy a 2d array in java
+0

それでも両方の配列が変更されます –

+0

@AhmadFahmy [Are you sure?](http://ideone.com/Ec01N5)浅いコピーで十分です。 – csirmazbendeguz

+0

ops私はあなたを誤解しているように見えます。あなたの答えは正直な感謝です:) –

1

配列は、Javaのオブジェクトです。 Oracle doc

オブジェクトはそのように複製されません。変数 "tiles"と "arr"は同じ配列を指しているだけで、コピーしていません。

System.arraycopy(tiles, 0, arr, 0, tiles.length); 

は、ここでは、システムのコピーに関する詳細を参照してください:あなたは配列をコピーしていないhttps://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)

関連する問題