Edycja 2: Poniżej znajduje się fragment kodu oparty na odpowiedzi DuffyMo, który ilustruje, jak obejść ograniczenia klonowania wielowymiarowych tablic za pomocą System.arraycopy.Jak sklonować tablicę wielowymiarową w języku 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
}
}
[ORIGINAL PYTANIE] Co znajduje się w prosty sposób (w pełni) sklonować wielowymiarowej tablicy w Java? Ten program ilustruje mój problem.
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();
}
}
Po uruchomieniu powyższego kodu, arrayMaster zmienia się tak samo jak zmiany tablicy, wbrew moim zamierzeniom. Myśląc, że mogę sklonować każdy pojedynczy element wymiarową tablicę arrayMaster, starałem się obejść problem z tym:
for (int iter = 0; iter < arrayMaster.length; iter++) {
arrayChanges[iter] = arrayMaster[iter].clone();
}
ale kiedy uruchomić kod, który daje NullPointerException z jakiegoś powodu. Czy napisanie metody, która pętli przez poszczególne wartości całkowite tablic mojej jedynej opcji?
Dzięki.
EDYCJA 1: To również nie rozwiązuje problemu.
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();
}
}
Dzięki za odpowiedź. Przepisałem to, aby powiązać wszystkie wartości w jedną klasę i nie chciałem zadeklarować instancji obiektu, więc tak, to był problem. Jednak problem utrzymuje się nawet przy poprawnie napisanym kodzie, jak opisano tutaj [link] (http://www.crazysquirrel.com/computing/java/basics/multidimensional-array-cloning.jspx) – vancan1ty
Problem nie jest statyczny w ogóle. Problem polega na tym, że dwie nazwy "arrayChanges" i "arrayMaster" odnoszą się do tego samego obiektu. Wykonałeś płytką kopię, gdy zadeklarowałeś 'arrayChanges'. Zobacz, na jakim płytkim kopiowaniu jest http://en.wikipedia.org/wiki/Object_copy. –
@ user1184054 Proszę zaksięgować nowo poprawnie napisany kod na pytanie. –