Próbuję zbudować HashMap, który będzie miał liczbę całkowitą jako klucze i obiekty jako wartości.
Moja składnia to:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Jednak zwrócony błąd to - Błąd składni na tokenie „int”, Wymiary oczekiwane po tym tokenie - Nie rozumiem, dlaczego powinienem dodać wymiar (tj. Zrobić int do tablicy), ponieważ potrzebuję tylko przechowywać cyfrę jako klucz.
Co mógłbym zrobić?
Z góry dziękuję! :)
HashMap
nie obsługuje prymitywów, tylko obiekty.int
wartością, a nie kluczem.Integer
zamiast tego.Odpowiedzi:
Nie możesz użyć prymitywu, ponieważ HashMap używa obiektu wewnętrznie dla klucza. Możesz więc używać tylko obiektu, który dziedziczy po Object (czyli dowolnego obiektu).
To jest funkcja put () w HashMap i jak widać, używa Object dla K:
Wyrażenie „k = e.key” powinno to wyjaśnić.
Proponuję użyć wrappera takiego jak Integer i autoboxing.
źródło
Użyj
Integer
zamiast tego.Java automatycznie dokona autoboxu
int
prymitywnych wartości doInteger
obiektów.Przeczytaj więcej o autoboxingu z dokumentacji Oracle Java.
źródło
myObject
ArrayMap
lubSimpleArrayMap
na Androidzie, aby zaoszczędzić pamięć i zwiększyć wydajność ( Więcej informacji )Dla każdego, kto koduje Javę dla urządzeń z Androidem i kończy tutaj: używaj
SparseArray
dla lepszej wydajności;dzięki temu możesz użyć int zamiast Integer jak;
źródło
SparseArray
Jeśli przydzielisz dużo pamięci do pakowania i rozpakowywania int, tak jak w przypadku aHashMap
, maszyna wirtualna będzie musiała wstrzymać wykonywanie wcześniej w celu czyszczenia pamięci . Jest to ważne, jeśli próbujesz zrobić coś często i szybko.SparseArray
wynosi O (n) (HashMap
ma O (1) ). Jest to ważne, gdy liczba elementów jest duża. Wstawianie na początek takiej tablicy jest znacznie wolniejsze.put()
przyjmujeO(n)
(nien log n
) do wstawienia na początku, ponieważ znajduje pozycję, a następnie przesuwa wszystkie kolejne elementy.delete()
faktycznie trwaO(log n)
, ale następne wstawienie lub iteracja przez elementy po usunięciu będzie wymagało czyszczenia pamięciO(n)
.Możesz spróbować użyć Trove http://trove.starlight-systems.com/
TIntObjectHashMap jest prawdopodobnie tym, czego szukasz.
źródło
Głównym powodem, dla którego HashMap nie dopuszcza prymitywów jako kluczy, jest to, że HashMap jest zaprojektowany w taki sposób, że do porównywania kluczy wykorzystuje metodę equals () , a metodę można wywołać tylko na obiekcie, a nie na prymitywie.
Zatem gdy int jest automatycznie przypisywane do liczby całkowitej, Hashmap może wywołać metodę equals () na obiekcie Integer.
Dlatego powinieneś używać Integer zamiast int. Chodzi mi o to, że hashmap zgłasza błąd podczas umieszczania int jako klucza (nie znam znaczenia wyrzucanego błędu)
A jeśli tak myślisz, możesz zwiększyć wydajność Map, tworząc prymityw jako klucz, istnieje biblioteka o nazwie FastUtil, która zawiera implementację Map z typem int jako kluczem.
Z tego powodu jest znacznie szybszy niż Hashmap
źródło
Map<Integer, String>
wMap<Object, Object>
podczas kompilacji. BTW, istnieje IdentityHashMap, który używa==
operatora do sprawdzania równości, który nadal nie zezwala na typy pierwotne.HashMap nie zezwala na prymitywne typy danych jako argumenty. Może przyjmować tylko obiekty tzw
nie będzie działać.
Musisz zmienić deklarację na
więc nawet jeśli wykonasz poniższe czynności
Prymitywny typ danych jest automatycznie przypisywany do obiektu typu Integer.
Możesz przeczytać więcej na temat autoboxing tutaj http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
źródło
Jeśli kodujesz w systemie Android, istnieje SparseArray , mapujący liczbę całkowitą na obiekt.
źródło
użyj int jako Object nie jako typu pierwotnego
źródło
-1
. W przeciwieństwie do innych komentuję przed ukaraniem (nie zrobiłem -1 dla ciebie).Proszę użyć
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
źródło
Tablica jest również obiektem, więc
HashMap<int[], MyObject>
jest prawidłową konstrukcją, która używa tablic int jako kluczy.Kompilator nie wie, czego chcesz lub czego potrzebujesz, po prostu widzi konstrukcję językową, która jest prawie poprawna i ostrzega, czego brakuje, aby była w pełni poprawna.
źródło
Dla kogoś, kto jest zainteresowany taką mapą, ponieważ chcesz zmniejszyć ślad autoboxingu w Javie dla wrapperów nad typami prymitywów, poleciłbym użycie kolekcji Eclipse . Trove nie jest już obsługiwany i uważam, że jest to dość zawodna biblioteka (choć i tak jest dość popularna) i nie można jej porównać z kolekcjami Eclipse .
W tym przykładzie powyżej IntObjectHashMap .
Ponieważ potrzebujesz mapowania obiektów int-> , rozważ również użycie
YourObjectType[]
tablicy lubList<YourObjectType>
wartości dostępu według indeksu, ponieważ map jest z natury tablicą asocjacyjną z typem int jako indeksem.źródło