1

我有这个Java代码:

boolean[][] defaultBoard = {{false, false, false},
                            {false, false, false},
                            {false, false, false}};
Board board = new Board(defaultBoard);
Board nextBoard = new Board(defaultBoard);
nextBoard.getBoard()[1][5] = true;
board.printBoard();

printBoard

public void printBoard() {
    for (boolean row[] : board) {
        for (boolean cell : row) {
            System.out.print( cell ? "#" : "." );
        }
        System.out.println();
    }
    System.out.println();
}

但它返回

...
.#.
...

这让我想到了,nextBoard并且board得到了相同的内存地址。我的问题是:如何创建副本nextBoard以便在nextBoard编辑时board不进行编辑?

4

5 回答 5

4

它不是boardnextBoard那是一样的。它是defaultBoard您传递给构造函数的数组。您需要传递不同的数组。否则,您只是在修改同一个数组。

更好的是,为了确保实例Board始终包含一个新数组,我建议在构造函数中对数组进行深层复制。

于 2013-05-11T20:56:44.793 回答
0

数组是一个对象,因此您将向Board构造函数传递一个引用。由于您使用的是同一个数组,因此两者boardnextBoard共享同一个对象。要避免这种情况,请使用该clone方法。这样,您将拥有defaultBoard数组的副本,并且每个实例都有自己的板。它看起来像这样:

Board board = new Board(cloneBoard(defaultBoard));
Board nextBoard = new Board(cloneBoard(defaultBoard));

private boolean[][] cloneBoard(boolean[][] boardToClone) {
    boolean[][] clone = new boolean[boardToClone.length][];
    for(int i = 0; i < boardToClone.length; i++) {
        clone[i] = boardToClone[i].clone();
    }
    return clone;
}
于 2013-05-11T20:53:49.293 回答
0

使用.clone()方法,它存在于任何 Java Object 子类中,据我所知,所有这些子类。

于 2013-05-11T20:54:53.287 回答
0

在这种情况下,我会让电路板创建一个大小的数组基础

class Board {
    final boolean[] board;

    public Board(int width, height) {
        board = new[width][height];
    }

    public boolean[][] getBoard() { return board; }

    public void set(int x, int y, boolean value) { board[x][y] = value; }
}

现在你的代码看起来像这样

Board board = new Board(3, 3);
Board nextBoard = new Board(3, 3);
nextBoard.set(1, 2, true); // the last element is 2 not 5
board.printBoard();
于 2013-05-11T21:50:04.490 回答
0

每次需要将其传递给对象时,您都需要创建一个新的数组,以便对象看到一个新数组而不是同一个数组。

于 2013-05-13T06:23:52.683 回答