2017-01-11 28 views
6
ArrayList<Integer> a =new ArrayList<Integer>(); 
ArrayList<ArrayList<Integer>> j =new ArrayList<ArrayList<Integer>>(); 

a.add(1); 
a.add(2); 
a.add(3); 

for(int c=0; c<10; c++){ 
    j.add(a); 
} 
j.get(3).add(1); 
System.out.println(j); 

Có ai biết tại sao mã này thêm 1 vào mọi phần tử của j chứ không phải chỉ phần tử thứ ba và tôi có thể làm gì để sửa lỗi này?Thêm phần tử vào danh sách mảng 2d trong java

Trả lời

3

Bạn sử dụng cùng một ví dụ ArrayLista trong mọi thành phần của j. Bạn phải tạo một phiên bản mới ArrayList cho mọi thành phần của j nếu bạn muốn chúng khác nhau.

2
 for(int c=0; c<10; c++) 
     { 
      j.add(new ArrayList<>(a)); 
     } 

Trong mã a, là con trỏ đến vị trí bộ nhớ nơi ArrayList cư trú.

-1

Thực tế j.get (3) tham chiếu arrayList như mọi j.get (c), đó là lý do tại sao mỗi ô của j trỏ vào một được thay đổi. hình ảnh tiếp theo cho thấy nó hoạt động như thế nào. illustration

+0

Bạn không sử dụng dấu ngoặc vuông để get –

11

Đây là những gì sẽ xảy ra khi bạn thêm danh sách mảng a vào danh sách mảng j 10 lần. ![enter image description here

Đây là những gì sẽ xảy ra khi bạn thêm 1 vào danh sách mảng a.

![enter image description here

Vì vậy, về cơ bản tất cả 10 chỉ số của ArrayList j điểm đến một ArrayList đơn a. Do đó, việc in ấn giá trị từ bất kỳ chỉ số nào của j sẽ luôn mang lại cho bạn kết quả tương tự.


Để cho mỗi điểm chỉ số vào một danh sách mảng khác nhau:

enter image description here

Các vấn đề liên quan