Modifica 2: Di seguito è riportato un frammento di codice basato sulla risposta di DuffyMo che illustra come aggirare i limiti della clonazione per gli array multidimensionali mediante System.arraycopy.Come clonare un array multidimensionale in java?
import java.util.Arrays;
public class Randar {
public static int[][] arrayMaster = {{6,1}, {10,1}, {1,1}};
private static int[][] arrayChanges = new int[arrayMaster.length][2];
public Randar() {
}
public static void main(String[] args) {
arrayChanges[0][0] = 0;
resetArrays(arrayChanges, arrayMaster);
arrayChanges[0][0] = 0;
System.out.format("arrayMaster: %s, arrayChanges: %s", Arrays.deepToString(arrayMaster), Arrays.deepToString(arrayChanges));
}
public static void resetArrays(int[][] arrayChanges, int[][] arrayMaster) {
for (int a=0; a< arrayMaster.length; a++) {
System.arraycopy(arrayMaster[a], 0, arrayChanges[a], 0, arrayMaster[a].length);
}
// arrayChanges = arrayMaster.clone(); will NOT work as expected
}
}
[domanda originale] Che cosa è un modo semplice per (completamente) clonare un array multidimensionale in java? Questo programma illustra il mio problema.
import java.util.Arrays;
public class Randar {
public static int[][] arrayMaster = {{6,1}, {10,1}, {1,1}};
static private int[][] arrayChanges = arrayMaster;
public static void main(String[] args) {
arrayChanges[0][0] = 0;
resetArrays();
System.out.format("arrayMaster: %s, arrayChanges: %s",Arrays.deepToString(arrayMaster), Arrays.deepToString(arrayChanges));
}
public static void resetArrays() {
arrayChanges = arrayMaster.clone();
}
}
Quando si esegue il codice sopra riportato, arrayMaster cambia così come arrayChanges, contrariamente alle mie intenzioni. Pensando che ho potuto clonare ogni singolo membro matrice bidimensionale di arrayMaster, ho cercato di aggirare il problema con questo:
for (int iter = 0; iter < arrayMaster.length; iter++) {
arrayChanges[iter] = arrayMaster[iter].clone();
}
ma quando ho eseguito il codice che dà un NullPointerException per qualche motivo. Sta scrivendo un metodo che scorre attraverso i singoli valori interi degli array, la mia unica opzione?
Grazie.
MODIFICA 1: Questo non risolve il problema.
import java.util.Arrays;
public class Randar {
public int[][] arrayMaster = {{6,1}, {10,1}, {1,1}};
private int[][] arrayChanges = arrayMaster.clone();
public Randar() {
}
public static void main(String[] args) {
Randar Randar1 = new Randar();
Randar1.arrayChanges[0][0] = 0;
resetArrays(Randar1.arrayChanges, Randar1.arrayMaster);
Randar1.arrayChanges[0][0] = 0;
System.out.format("arrayMaster: %s, arrayChanges: %s", Arrays.deepToString(Randar1.arrayMaster), Arrays.deepToString(Randar1.arrayChanges));
}
public static void resetArrays(int[][] arrayChanges, int[][] arrayMaster) {
/*for (int a=0; a< arrayMaster.length; a++) {
System.arraycopy(arrayMaster[a].clone(), 0, arrayChanges[a], 0, arrayMaster[a].length);
} */
arrayChanges = arrayMaster.clone();
}
}
Grazie per la risposta. Ho riscritto questo per raggruppare tutti i valori in una classe e non volevo dichiarare un'istanza di un oggetto, quindi sì, quello era un problema. Tuttavia, il problema persiste anche con codice scritto correttamente, come descritto qui [collegamento] (http://www.crazysquirrel.com/computing/java/basics/multidimensional-array-cloning.jspx) – vancan1ty
Il problema non è la staticità affatto. Il problema è che i due nomi 'arrayChanges' e' arrayMaster' si riferiscono allo stesso oggetto. Hai fatto una copia superficiale quando hai dichiarato 'arrayChanges'. Vedi http://en.wikipedia.org/wiki/Object_copy per quale copia superficiale è. –
@ user1184054 Si prega di inviare il codice appena scritto correttamente alla domanda. –