Java重置和复制二维数组

时间:2015-02-16 19:45:32

标签: java arrays

我无法在java中重置二维数组。我有一个接受二维数组的类。我要做的是复制现有数组,编辑该副本,在该类的实例中使用该副本,并将该数组重置为原始数组的副本,所有这些都不需要修改原始数组。如果需要更多信息,请询问。提前致谢!

public Iterable<Board> neighbors(){

    Stack<Board> neighbors = new Stack<Board>();

    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            if (tiles[i][j] == 0){

                int [][] copy = new int[N][N];
                System.arraycopy(tiles, 0, copy, 0, tiles.length);

                if (i != 0){
                    exch(copy, i, j, i - 1, j);
                    neighbors.push(new Board(copy));
                    copy = null;
                    System.arraycopy(tiles, 0, copy, 0, tiles.length);
                }
                if (i <= N - 2){
                    exch(copy, i, j, i + 1, j);
                    neighbors.push(new Board(copy));
                    copy = null;
                    System.arraycopy(tiles, 0, copy, 0, tiles.length);
                }
                if (j != 0){
                    exch(copy, i, j, i, j - 1);
                    neighbors.push(new Board(copy));
                    copy = null;
                    System.arraycopy(tiles, 0, copy, 0, tiles.length);
                }
                if (j <= N - 2){
                    exch(copy, i, j, i, j + 1);
                    neighbors.push(new Board(copy));
                    copy = null;
                    System.arraycopy(tiles, 0, copy, 0, tiles.length);
                }
            }
        }
    }
    return neighbors;

}

我将代码更改为上面显示的代码但是我收到了此错误

Exception in thread "main" java.lang.NullPointerException
at java.lang.System.arraycopy(Native Method)
at Board.neighbors(Board.java:74)
at Board.main(Board.java:136)

2 个答案:

答案 0 :(得分:2)

请记住,在Java中,多维数组实际上是引用其他数组的数组。在Java内部,数组只能有一个维度。

要复制数组的内容,可以使用System.arraycopy()方法。请注意,对于多维数组,这只会将顶级数组的引用复制到相同的内部数组,所以事情要复杂一些:

int[][] copy = new int[original.length][]; // new top-level array of same size
for (int i = 0; i < copy.length; i++) {
    copy[i] = new int[original[i].length]; // new inner array of same size
    System.arraycopy(original[i], 0, copy[i], 0, original[i].length); // copy values
}

答案 1 :(得分:0)

int [][] copy = tiles;

这不是你制作数组副本的方式,在上面提到的代码中copy只是对tiles Array对象的另一个引用。

使用System.arraycopy

int[] src  = new int[]{1,2,3,4,5};
int[] dest = new int[5];

System.arraycopy( src, 0, dest, 0, src.length );

如果您更改srcdest将保持不变