Chỉnh sửa 2: Dưới đây là đoạn mã dựa trên phản hồi của DuffyMo, minh họa cách giải quyết các hạn chế của việc sao chép các mảng đa chiều bằng System.arraycopy.Làm thế nào để sao chép một mảng đa chiều trong 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
}
}
[HỎI ORIGINAL] một cách đơn giản là gì (đầy đủ) sao chép một mảng đa chiều trong java? Chương trình này minh họa vấn đề của tôi.
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();
}
}
Khi mã trên chạy, mảngMaster thay đổi cũng như mảngChuyển đổi, trái với ý định của tôi. Suy nghĩ rằng tôi có thể sao chép từng thành viên mảng chiều duy nhất của arrayMaster, tôi đã cố gắng để có được xung quanh vấn đề với điều này:
for (int iter = 0; iter < arrayMaster.length; iter++) {
arrayChanges[iter] = arrayMaster[iter].clone();
}
nhưng khi tôi chạy mã mà đưa ra một NullPointerException đối với một số lý do. Là viết một phương pháp mà vòng qua các giá trị số nguyên riêng lẻ của các mảng tùy chọn duy nhất của tôi?
Cảm ơn.
CHỈNH SỬA 1: Điều này cũng không khắc phục được sự cố.
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();
}
}
Cảm ơn phản hồi của bạn. Tôi viết lại điều này để gộp tất cả các giá trị vào một lớp và không muốn khai báo một cá thể của một đối tượng, do đó, vâng, đó là một vấn đề. Tuy nhiên, vấn đề vẫn tồn tại ngay cả với mã được viết chính xác, như được mô tả ở đây [link] (http://www.crazysquirrel.com/computing/java/basics/multidimensional-array-cloning.jspx) – vancan1ty
Vấn đề không phải là tĩnh ở tất cả. Vấn đề là hai tên 'arrayChanges' và' arrayMaster' tham chiếu đến cùng một đối tượng. Bạn đã tạo một bản sao nông khi bạn khai báo 'mảngChanges'. Xem http://en.wikipedia.org/wiki/Object_copy để biết bản sao nông là gì. –
@ user1184054 Vui lòng đăng mã mới được viết chính xác của bạn cho câu hỏi. –