J'essaye de construire un HashMap qui aura des nombres entiers comme clés et des objets comme valeurs.
Ma syntaxe est:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Cependant, l'erreur renvoyée est - Erreur de syntaxe sur le jeton "int", Dimensions attendues après ce jeton - Je ne comprends pas pourquoi je devrais ajouter une dimension (c'est-à-dire: faire de l'int dans un tableau) car je n'ai besoin que de stocker un chiffre comme clé.
"Que pouvais-je faire?"
Merci d'avance! :)
HashMap
ne gère pas les primitives, juste les objets.int
la valeur, pas la clé.Integer
plutôt.Réponses:
Vous ne pouvez pas utiliser une primitive car HashMap utilise un objet en interne pour la clé. Vous ne pouvez donc utiliser qu'un objet qui hérite d'Object (c'est-à-dire n'importe quel objet).
C'est la fonction put () dans HashMap et comme vous pouvez le voir, elle utilise Object for K:
L'expression "k = e.key" devrait le rendre clair.
Je suggère d'utiliser un wrapper comme Integer et autoboxing.
la source
Utilisez
Integer
plutôt.Java ajoutera automatiquement vos
int
valeurs primitives auxInteger
objets.En savoir plus sur l' autoboxing à partir des documentations Oracle Java.
la source
myObject
ArrayMap
ouSimpleArrayMap
sur Android pour économiser de la mémoire et augmenter les performances ( Plus d'informations )Pour tous ceux qui codent Java pour les appareils Android et se retrouvent ici: utilisez
SparseArray
pour de meilleures performances;avec cela, vous pouvez utiliser int au lieu de Integer comme;
la source
SparseArray
Si vous allouez un tas d'entrées de mémoire et de déballage comme vous le feriez avec aHashMap
, le vm devra interrompre plus tôt l'exécution pour le ramasse-miettes. Ceci est important si vous essayez de faire quelque chose fréquemment et rapidement.SparseArray
est O (n) (HashMap
a O (1) ). C'est important lorsque le nombre d'éléments est important. L'insertion au début d'un tel tableau est beaucoup plus lente.put()
prendO(n)
(pasn log n
) pour l'insertion au début car il trouve la position puis décale tous les éléments suivants.delete()
lui-même prend en effetO(log n)
, mais la prochaine insertion ou itération à travers des éléments après la suppression nécessitera un garbage collection qui prendO(n)
.Vous pouvez essayer d'utiliser Trove http://trove.starlight-systems.com/
TIntObjectHashMap est probablement ce que vous recherchez.
la source
La principale raison pour laquelle HashMap n'autorise pas les clés primitives est que HashMap est conçu de telle manière que pour comparer les clés, il utilise la méthode equals () , et une méthode ne peut être appelée que sur un objet et non sur une primitive.
Ainsi, lorsque int est automatiquement converti en Integer, Hashmap peut appeler la méthode equals () sur l'objet Integer.
C'est pourquoi, vous devez utiliser Integer au lieu de int. Je veux dire que hashmap lève une erreur en mettant int comme clé (je ne connais pas la signification de l'erreur qui est lancée)
Et si vous pensez que, vous pouvez accélérer les performances de Map en créant une primitive comme clé, il existe une bibliothèque appelée FastUtil qui contient une implémentation de Map avec le type int comme clé.
Pour cette raison, il est beaucoup plus rapide que Hashmap
la source
Map<Integer, String>
enMap<Object, Object>
lors de la compilation. BTW, il y a IdentityHashMap qui utilise l'==
opérateur pour la vérification d'égalité, qui n'autorise toujours pas les types primitifs.HashMap n'autorise pas les types de données primitifs comme arguments. Il ne peut accepter que des objets donc
ne fonctionnera pas.
Vous devez changer la déclaration en
donc même quand tu fais ce qui suit
Le type de données primitif est automatiquement renvoyé à un objet Integer.
Vous pouvez en savoir plus sur l'autoboxing ici http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
la source
Si vous codez sous Android, il y a SparseArray , mappant un entier à un objet.
la source
utiliser int comme objet pas comme type primitif
la source
-1
. Je contrairement aux autres commenter avant de pénaliser (je n'ai pas -1 vous).Veuillez utiliser
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
la source
Un tableau est également un objet, tout
HashMap<int[], MyObject>
comme une construction valide qui utilise des tableaux int comme clés.Le compilateur ne sait pas ce que vous voulez ou ce dont vous avez besoin, il voit juste une construction de langage qui est presque correcte et avertit ce qui manque pour qu'elle soit entièrement correcte.
la source
Pour quelqu'un qui s'intéresse à une telle carte parce que vous souhaitez réduire l' empreinte de l'autoboxing en Java des wrappers sur les types primitifs, je recommanderais d'utiliser les collections Eclipse . Trove n'est plus pris en charge , et je pense que c'est une bibliothèque assez peu fiable (bien qu'elle soit de toute façon très populaire) et ne peut pas être comparée aux collections Eclipse .
Dans cet exemple ci-dessus IntObjectHashMap .
Comme vous avez besoin d'un mappage d' objets int-> , considérez également l'utilisation du
YourObjectType[]
tableau ouList<YourObjectType>
et accédez aux valeurs par index, car map est, par nature, un tableau associatif avec le type int comme index.la source