Ich versuche eine HashMap zu erstellen, die eine Ganzzahl als Schlüssel und Objekte als Werte enthält.
Meine Syntax lautet:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Der zurückgegebene Fehler lautet jedoch: - Syntaxfehler für Token "int", Dimensionen, die nach diesem Token erwartet werden - Ich verstehe nicht, warum ich eine Dimension hinzufügen sollte (dh: das int in ein Array verwandeln), da ich nur eine Ziffer speichern muss als Schlüssel.
Was könnte ich tuen?
Danke im Voraus! :) :)
HashMap
behandelt keine Grundelemente, nur Objekte.int
dem Wert, nicht der Schlüssel.Integer
stattdessen.Antworten:
Sie können kein Grundelement verwenden, da HashMap das Objekt intern für den Schlüssel verwendet. Sie können also nur ein Objekt verwenden, das von Object erbt (dh ein beliebiges Objekt).
Das ist die Funktion put () in HashMap und wie Sie sehen, verwendet sie Object for K:
Der Ausdruck "k = e.key" sollte es klar machen.
Ich schlage vor, einen Wrapper wie Integer und Autoboxing zu verwenden.
quelle
Verwenden Sie
Integer
stattdessen.Java kopiert Ihre
int
primitiven Werte automatisch automatisch inInteger
Objekte.Weitere Informationen zum Autoboxen in Oracle Java-Dokumentationen.
quelle
myObject
ArrayMap
oderSimpleArrayMap
auf Android zu verwenden, um Speicherplatz zu sparen und die Leistung zu steigern ( Weitere Informationen )Für alle, die Java für Android-Geräte codieren und hier landen: Verwenden Sie es
SparseArray
für eine bessere Leistung;mit diesem können Sie int anstelle von Integer wie verwenden;
quelle
SparseArray
Wenn Sie wie bei a eine Reihe von Speicherboxen und Unboxing-Ints zuweisenHashMap
, muss die VM die Ausführung für die Speicherbereinigung früher anhalten. Dies ist wichtig, wenn Sie versuchen, häufig und schnell etwas zu tun.SparseArray
ist O (n) (HashMap
hat O (1) ). Es ist wichtig, wenn die Anzahl der Elemente groß ist. Das Einfügen in den Anfang eines solchen Arrays ist viel langsamer.put()
nimmtO(n)
(nichtn log n
) zum Einfügen beim Start, weil es die Position findet und dann alle folgenden Elemente verschiebt.delete()
selbst dauert zwarO(log n)
, aber das nächste Einfügen oder Durchlaufen von Elementen nach dem Löschen erfordert eine Garbage Collection, die dauertO(n)
.Sie können versuchen, Trove zu verwenden http://trove.starlight-systems.com/
TIntObjectHashMap ist wahrscheinlich das, wonach Sie suchen.
quelle
Der Hauptgrund dafür, dass HashMap kein Grundelement als Schlüssel zulässt, besteht darin, dass HashMap so konzipiert ist, dass zum Vergleichen der Schlüssel die Methode equals () verwendet wird und eine Methode nur für ein Objekt aufgerufen werden kann, das sich nicht auf einem Grundelement befindet.
Wenn int automatisch an Integer gesendet wird, kann Hashmap die Methode equals () für das Integer-Objekt aufrufen .
Aus diesem Grund sollten Sie Integer anstelle von int verwenden. Ich meine, Hashmap löst einen Fehler aus, während int als Schlüssel eingegeben wird (Sie kennen die Bedeutung des ausgelösten Fehlers nicht).
Und wenn Sie der Meinung sind, dass Sie die Map-Leistung beschleunigen können, indem Sie ein Grundelement als Schlüssel erstellen , gibt es eine Bibliothek namens FastUtil, die eine Map-Implementierung mit dem Typ int als Schlüssel enthält.
Aus diesem Grund ist es viel schneller als Hashmap
quelle
Map<Integer, String>
inMap<Object, Object>
während der Kompilierung. Übrigens gibt es IdentityHashMap, das einen==
Operator zur Gleichheitsprüfung verwendet, der primitive Typen immer noch nicht zulässt.HashMap erlaubt keine primitiven Datentypen als Argumente. Es können also nur Objekte akzeptiert werden
wird nicht funktionieren.
Sie müssen die Deklaration in ändern
Also auch wenn Sie Folgendes tun
Der primitive Datentyp wird automatisch an ein Integer-Objekt angehängt.
Weitere Informationen zum Autoboxen finden Sie hier http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
quelle
Wenn Sie in Android codieren, gibt es SparseArray , das dem Objekt eine Ganzzahl zuordnet .
quelle
Verwenden Sie int als Objekt und nicht als primitiven Typ
quelle
-1
. Ich kommentiere im Gegensatz zu anderen vor der Bestrafung (ich habe dich nicht -1).Benutzen Sie bitte
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
quelle
Ein Array ist auch ein Objekt, also
HashMap<int[], MyObject>
ein gültiges Konstrukt, das int-Arrays als Schlüssel verwendet.Der Compiler weiß nicht, was Sie wollen oder was Sie brauchen, er sieht nur ein Sprachkonstrukt, das fast korrekt ist, und warnt, was fehlt, damit es vollständig korrekt ist.
quelle
Für jemanden, der an einer solchen Karte interessiert ist, weil Sie den Platzbedarf von Autoboxen in Java von Wrappern über Primitivtypen reduzieren möchten , würde ich die Verwendung von Eclipse-Sammlungen empfehlen . Trove wird nicht mehr unterstützt , und ich glaube, es ist eine ziemlich unzuverlässige Bibliothek (obwohl sie sowieso sehr beliebt ist) und kann nicht mit Eclipse-Sammlungen verglichen werden .
In diesem Beispiel oben IntObjectHashMap .
Wie Sie braucht INT-> Objekt - Mapping, sollte auch Verwendung von
YourObjectType[]
Array oderList<YourObjectType>
und Zugriffs Werten von Index, als Karte ist von Natur aus einem assoziativen Array mit int - Typ als Index.quelle