2010-11-04 20 views
8

Próbowałem utworzyć listę map. W poniższym kodzie, ja spodziewałem się dostaćJava: utwórz listę HashMaps

[{start=1,text=ye}, {start=2,text=no}] 

jednak mam tylko

[{start=2,text=no}, {start=2,text=no}] 

Jak uniknąć nadrzędnymi pierwszą mapę? Oto mój kod:

HashMap mMap = new HashMap(); 
ArrayList list = new ArrayList(); 
list.add(new HashMap()); 
mMap.put("start",1); 
mMap.put("text","yes"); 
list.add(mMap); 
mMap.put("start",2); 
mMap.put("text","no"); 
list.add(mMap); 
System.out.println("Final result: " + list); 

dziękuję!

==========================

Jako uczącego Java, który przyszedł z tła języka procedura (SAS) Spędziłem sporo czasu na uczeniu się i eksperymentowaniu z ArrayList, LinkedList, Map, LinkedMap, itd. --- Nie mogę zmusić go do działania. I nie rozumiem, dlaczego z moją ograniczoną wiedzą. Teraz poniższe odpowiedzi są doskonałe! Wyjaśnili bardzo ważną strukturę danych w Javie, przynajmniej dla mnie.

DZIĘKUJEMY WSZYSTKO !!!!

Odpowiedz

28

Należy utworzyć nową mapę HashMap dla każdego wpisu, zamiast ponownego użycia istniejącego. To będzie działać:

HashMap mMap = new HashMap(); 
mMap.put("start",1); 
mMap.put("text","yes"); 
list.add(mMap); 
mMap = new HashMap(); // create a new one! 
mMap.put("start",2); 
mMap.put("text","no"); 
list.add(mMap); 

również można usunąć list.add(new HashMap()); jak dodaje pustą mapę do listy, które nigdy nie jest wypełniona.

0

Nigdy Oszczędzasz odniesienie do tej mapy:

list.add(new HashMap()); 
0

mieć trzy dodaje do listy. pierwsze dodanie jest do nowej instancji mapy; nigdy nie ustawiasz żadnych wartości. Drugi dodaje, że przekazujesz odwołanie do nMap, które ma 1, tak. Trzeci dodaj, że przekazujesz to samo odniesienie. Mapa ma teraz 3 odniesienia, pierwsza do mapy, do której nigdy nie dodano żadnych wartości, następne 2 do tej samej mapy. dlatego otrzymujesz ten sam wynik.

1

Tak, mapa hash z tego kawałka kodu

list.add(new HashMap()); 

nie odwołuje. Ostatecznie otrzymasz listę 3 przedmiotów, z których 2 są identyczne.

5

Coś, co jest być może warto również wspomnieć o tym, że należy określić typ elementów używanych w Liście, dla HashMap jej nie możliwe ponieważ jesteś mieszanie liczb całkowitych i Strings.

A inną rzeczą jest to, że należy użyć listy jako typ interfejsu, dzięki czemu są w stanie zmienić realizacji (ArrayList lub cokolwiek) w przyszłości.

Oto poprawiony kod:

Map mMap = new HashMap(); 
List<Map> list = new ArrayList();