2014-12-31 13 views
6

Ho problemi a creare una copia di un oggetto da utilizzare e modificare i valori per quella copia, invece cambia i valori per entrambi i miei oggetti. Codice per l'oggetto.Impossibile copiare il mio oggetto e modificare i valori

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; 
    } 
} 

e il codice per la funzione che ho cercato di mettersi al lavoro

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; 
} 

Così quando provo ad inserire il valore 1 nel nuovo oggetto quello vecchio cambia ancora.

+0

compila? o ricevi altri messaggi di errore? – ochi

risposta

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

Questa scheda marca e punto di layout allo stesso indirizzo. Provare qualcosa di simile:

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 mio errore, grazie per averlo fatto notare! – issathink

2

Quando si assegna una variabile di matrice a un array esistente, non si ottiene un nuovo array. Ottieni due riferimenti allo stesso array.

Ad esempio:

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

a e b non sono due matrici, ma due riferimenti alla stessa matrice. La modifica successiva dello a equivale alla modifica di b.

Con gli array 2D c'è un altro problema: un array int[][] x è in realtà un array che contiene una sequenza di altri array. Quindi una sua copia ingenua (int[][] y = x.clone()) fornirebbe due array int[][] con riferimenti condivisi a una sequenza di matrici int[].

Per copiare correttamente un array 2D è necessario copiare i singoli array 1D al suo interno.

-

Nel tuo caso, entrambi gli oggetti tenere i riferimenti allo stesso array. Se si desidera che dispongano di array separati, è necessario copiare l'array. Si potrebbe copiare l'array nel costruttore in questo modo:

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

Non ho fatto questa domanda, ma per i miei scopi di apprendimento puoi spiegare questo "Entrambi i tuoi oggetti contengono riferimenti allo stesso array". per me se non ti dispiace? –

+0

@KickButtowski 'int [] []' è un tipo di oggetto. OP ha usato il riferimento oggetto di 'board' dell'istanza" A "e lo ha passato all'istanza" B ". Ma dal momento che il costruttore assegna direttamente l'array 2d fornito alla variabile di istanza 'board'. Ciò significa che non ha creato una copia come pensava, ha semplicemente * condiviso * tale riferimento in modo che entrambe le istanze lo usino. – Tom

+0

grazie ragazzi, ma chiunque può analizzare il codice perché non lo vedo. Ricevo totalmente ciò che vedi, ma non riesco a stabilire una connessione tra quello che hai detto tu e lo snippet di codice –

1

Bisogna copiare la matrice layout pure.

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; 
} 
Problemi correlati