2017-01-11 80 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); 

Czy ktoś wie, dlaczego ten kod dodaje 1 do każdego elementu j, a nie tylko do trzeciego elementu, i co mogę zrobić, aby to naprawić?Dodawanie elementu do tablicy listy 2d w java

Odpowiedz

3

Używasz tej samej instancji ArrayLista w każdym elemencie z j. Musisz utworzyć nowe wystąpienie ArrayList dla każdego elementu z j, jeśli chcesz, aby były inne.

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

W kodzie a jest wskaźnikiem do miejsca w pamięci, w którym znajduje się ArrayList.

-1

Właściwie j.get (3) odwołuje się do tablicyList a, jak do każdego j.get (c), dlatego wszystkie komórki j wskazujące na a są zmienione. następne zdjęcie pokazuje, jak to działa. illustration

+0

Nie używać nawiasów kwadratowych dla get –

11

Tak dzieje się, gdy lista tablic a jest dodawana do listy tablicowej j 10 razy. ![enter image description here

Tak dzieje się po dodaniu 1 do listy tablic a.

![enter image description here

Więc w zasadzie wszystkie 10 indeksy ArrayList j punktów do jednego ArrayList a. W związku z tym drukowanie wartości z dowolnego indeksu j zawsze da taki sam wynik.


Aby niech każdy punkt indeksu do innej listy tablicy:

enter image description here