HashMap et int comme clé
J'essaie de construire un HashMap qui aura un entier comme clé et des objets comme valeurs.
Ma syntaxe est la suivante:
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: rendre l'int dans un tableau), car je n'ai besoin que de stocker un chiffre comme clé.
"Que pouvais-je faire?"
Merci d'avance! :)
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 de 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:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
L'expression "k = e.key" devrait le préciser.
Je suggère d'utiliser un wrapper comme Integer et autoboxing.
Utilisez Integer
à la place.
HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();
Java mettra automatiquement vos valeurs _ primitives int
en objets Integer
automatiquement.
En savoir plus sur autoboxing à partir des documentations Oracle Java.
Pour tous ceux qui codent Java pour Android appareils _ et finissent ici: utilisez SparseArray pour obtenir de meilleures performances.
private final SparseArray<myObject> myMap = new SparseArray<myObject>();
avec cela, vous pouvez utiliser int au lieu de Integer comme
int newPos = 3;
myMap.put(newPos, newObject);
myMap.get(newPos);
Vous pouvez essayer d’utiliser Trove http://trove.starlight-systems.com/
TIntObjectHashMap est probablement ce que vous recherchez.
HashMap n'autorise pas les types de données primitifs comme arguments. Il ne peut accepter que des objets
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
ne fonctionnera pas.
Vous devez modifier la déclaration en
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
alors même quand tu fais ce qui suit
myMap.put(2,myObject);
Le type de données primitif est automatiquement associé à un objet Integer.
8 (int) === boxing ===> 8 (Integer)
Vous pouvez en savoir plus sur l'autoboxing ici http://docs.Oracle.com/javase/tutorial/Java/data/autoboxing.html
La principale raison pour laquelle HashMap n'autorisant pas les primitives à être clés est que HashMap est conçu de telle manière que, pour comparer les clés, il utilise - equals () , et une méthode ne peut être appelée que sur un objet, pas sur une primitive.
Ainsi, lorsque int est automatiquement associé à Integer, Hashmap peut appeler la méthode égal à () sur l'objet Integer.
C'est pourquoi, vous devriez utiliser Integer au lieu de int. Je veux dire que hashmap lève une erreur en mettant int comme clé (je ne sais pas la signification de l'erreur qui est lancée)
Et si vous pensez cela, vous pouvez accélérer les performances de Map en définissant une primitive comme clé. Il existe une bibliothèque appelée FastUtil qui contient une implémentation de Map. avec int type comme clé.
Pour cette raison, il est beaucoup plus rapide que Hashmap
Si vous codez sous Android, il existe SparseArray , mappant un entier en objet.
utiliser int comme objet pas comme type primitif
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
Je ne comprends pas pourquoi je devrais ajouter une dimension (c'est-à-dire: faire l'int dans un tableau) car je n'ai besoin que de stocker un chiffre en tant que clé.
Un tableau est également un objet, donc HashMap<int[], MyObject>
est une construction valide qui utilise des tableaux int en tant que clés.
Le compilateur ne sait pas ce que vous voulez ou ce dont vous avez besoin, il ne fait que voir une construction de langage presque correcte et avertit de ce qui manque pour qu'elle soit totalement correcte.
Veuillez utiliser HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();