2017-04-02 32 views
0

在这里,我想使数组重复“改编”我的小块阵列,并提出一些修改它,问题是,当我做出改变(法邻居)它适用于原数组“砖”太当我只更改复制数组时,为什么我的原始数组被更改?

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/ 40480/is-java-reference-by-value-pass-by-value) – Ravi

+1

这不是传递参数或by-value的重复,因为数组未作为方法参数 –

+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 [你确定吗?](http://ideone.com/Ec01N5)浅拷贝应该是足够的。 – csirmazbendeguz

+0

ops看起来像我误解你..你的答案是正确的谢谢:) –

相关问题