HashMap et int as key
j'essaye de construire un HashMap qui aura un entier 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 token "int", Dimensions attendues après ce token - Je ne comprends pas pourquoi je devrais ajouter une dimension (i.e.: faire l'int dans un tableau) puisque je n'ai besoin de stocker un chiffre comme clé.
que pouvais-je faire?
Merci l'avance! :)
10 réponses
vous ne pouvez pas utiliser une primitive car HashMap utilise l'objet en interne pour la clé. Donc, vous ne pouvez utiliser un objet qui hérite de l'Objet (qui est un objet).
qui est la fonction put () dans HashMap et comme vous pouvez le voir il utilise objet pour 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 être clair.
je suggère d'utiliser un enveloppeur comme entier et autoboxing.
utilisez Integer
à la place.
HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();
Java va automatiquement autobox vos valeurs primitives int
aux objets Integer
.
plus d'informations à propos de autoboxing from Oracle Java documentations.
pour tous ceux qui code Java pour les appareils Android et finit ici: utilisez SparseArray pour une meilleure performance
private final SparseArray<myObject> myMap = new SparseArray<myObject>();
avec ceci vous pouvez utiliser int au lieu D'entier comme
int newPos = 3;
myMap.put(newPos, newObject);
myMap.get(newPos);
vous pouvez essayer D'utiliser le Trove http://trove.starlight-systems.com/
TIntObjectHashMap est probablement ce que vous recherchez.
HashMap ne permet pas les types de données primitifs comme arguments. Il ne peut accepter des objets que si
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
ne marchera pas.
vous devez changer la déclaration en
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
donc même si vous faites ce qui suit
myMap.put(2,myObject);
le type de données primitif est autoboxé à un objet entier.
8 (int) === boxing ===> 8 (Integer)
vous pouvez en savoir plus sur autoboxing ici http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
si vous codez pour Android, il y a SparseArray , mapping integer to object.
la raison principale avec HashMap ne permettant pas les clés primitives est que HashMap est conçu de telle manière que pour comparer les clés, il fait usage de equals () méthode, et une méthode ne peut être appelée que sur un objet non sur une primitive.
ainsi quand int est autoboxé À entier, Hashmap peut appeler equals () méthode sur l'Entier de l'objet.
C'est pourquoi, vous devriez utiliser Integer au lieu de int. Je veux dire hashmap lance une erreur en mettant int comme une clé (ne sait pas la signification de l'erreur qui est lancée)
et si vous pensez que, vous pouvez rendre la performance de carte plus rapide en faisant une primitive comme une clé, il y a une bibliothèque appelée FastUtil qui contient une implémentation de carte avec le type int comme une clé.
pour cette raison, il est beaucoup plus rapide que Hashmap
utiliser des int comme Objet, non pas comme un type de primitive
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
s'il vous plaît utiliser
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
Je ne comprends pas pourquoi je devrais ajouter une dimension (i.e.: faire l'int dans un tableau) puisque je n'ai besoin de stocker qu'un chiffre comme clé.
un tableau est aussi un objet, donc HashMap<int[], MyObject>
est une construction valide qui utilise des tableaux int comme clés.
compilateur ne sait pas ce que vous voulez ou ce dont vous avez besoin, il voit juste une construction de langue qui est presque correcte, et avertit ce qui manque pour qu'il soit entièrement correct.