2014-12-31 48 views
6

我在創建要使用的對象的副本並更改該副本的值時出現問題,而是改變了這兩個對象的值。代碼爲對象。無法複製我的對象並更改值

public class Board { 
    private int[][] board; 

    public Board() { 
     board = new int[9][9]; 
    } 
    public Board(int[][] layout){ 
     board = layout; 
    } 

    public int[][] getBoard(){ 
     return board; 
    } 
    public int getBoardValue(int y, int x){ 
     return board[y][x]; 
    } 
    public void insertValue(int v, int y, int x){ 
     board[y][x] =v; 
    } 
} 

爲此,我一直試圖去上班

public Board copy(Board b) { 
    Node node = new Node(b); 
    int[][] layout = node.getBoard().getBoard(); 
    Board temp = new Board(layout); 
    temp.insertValue(1,4,5); 
    return temp; 
} 

所以,當我嘗試在新對象舊的仍然改變插入值1的功能代碼。

+0

它編譯?或者你有其他的錯誤信息? – ochi

回答

3
public Board(int[][] layout){ 
    board = layout; 
} 

本作板和佈局點:你可以在陣列在這樣的構造複製。嘗試是這樣的:

public Board(int[][] layout){ 
    this(); 
    for(int i=0; i<layout.length;i++) 
    for(int j=0; j<layout[0].length;j++) 
     board[i][j] = layout[i][j]; 
} 
+0

@Tom我的錯誤,謝謝你指出! – issathink

2

當您將數組變量分配給現有數組時,您不會獲得新數組。你會得到兩個對同一個數組的引用。

例如:

int[] a = { 1, 2, 3}; 
int[] b = a; 

ab不是兩個陣列,但兩個引用相同的數組。隨後改變a與改變b相同。

使用二維數組還有另一個問題:數組int[][] x實際上是一個數組,其中包含一系列其他數組。所以它的一個天真的副本(int[][] y = x.clone())會給你兩個int[][]陣列持有int[]數組序列的共享引用。

要正確複製2D陣列,需要複製其中的單個1D陣列。

-

在你的情況,你都持有對象以相同的數組引用。如果你想讓他們有獨立的數組,你需要複製數組。在同一個地址

public Board(int[][] layout) { 
    board = new int[layout.length][]; 
    for (int i = 0; i < layout.length; ++i) { 
     board[i] = layout[i].clone(); 
    } 
} 
+0

我沒有問這個問題,但爲了我的學習目的,你可以解釋一下這兩個「你的對象持有對同一個數組的引用」。對我來說如果你不介意的話? –

+0

@KickButtowski'int [] []'是一個對象類型。 OP使用實例「A」的「board」的對象引用並將其傳遞給實例「B」。但是由於構造函數直接將提供的2d數組賦給實例變量'board'。這意味着他沒有像他想的那樣創建一個副本,他只是*共享那個引用,所以兩個實例都使用它。 – Tom

+0

謝謝你們,但任何人都可以剖析代碼因爲我看不到它。我完全瞭解你所看到的,但我無法將你們所說的與代碼片段 –

1

你必須在layout陣列複製爲好。

public Board copy(Board b) { 
    Node node = new Node(b); 
    int[][] oldLayout = node.getBoard().getBoard(); 
    int[][] newLayout = new int[9][9]; 
    for(int i=0; i<newLayout.length; i++) { 
     newLayout[i] = Arrays.copyOf(oldLayout[i], oldLayout[i].length); 
    } 
    Board temp = new Board(newLayout); 
    temp.insertValue(1,4,5); 
    return temp; 
}