web-dev-qa-db-fra.com

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! :)

99
MrD

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.

20
user1883212

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.

126
gaborsch

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);
41
Stepoid

Vous pouvez essayer d’utiliser Trove http://trove.starlight-systems.com/
TIntObjectHashMap est probablement ce que vous recherchez.

5
Arek

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

3
Lakshmi

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

3
FatherMathew

Si vous codez sous Android, il existe SparseArray , mappant un entier en objet.

3
alvinsj

utiliser int comme objet pas comme type primitif

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
1
franki3xe

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.

0
Yoory N.

Veuillez utiliser HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

0
Michael