122 votes

HashMap et int comme clé

Je suis en train de construire une HashMap qui aura des entiers comme clés et des objets comme valeurs.

Ma syntaxe est :

HashMap myMap = new HashMap();

Cependant, l'erreur retourné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 transformer l'entier en tableau) puisque je n'ai besoin de stocker qu'un chiffre en tant que clé.

Que pourrais-je faire?

18 votes

HashMap ne gère pas les types primitifs, juste les objets.

1 votes

Question SO associée, mais avec int étant la valeur, et non la clé.

5 votes

Utilisez Integer à la place.

151voto

GaborSch Points 6587

Utilisez Integer à la place.

HashMap myMap = new HashMap();

Java convertira automatiquement vos valeurs primitives int en objets Integer.

En savoir plus sur l'autoboxing à partir de la documentation Oracle Java.

10 votes

Il ne devrait pas non plus nommer une classe myObject

0 votes

@AdamGent Correct. Tous les noms de classe doivent commencer par une majuscule, j'ai corrigé le code recommandé.

3 votes

Je sais que tu sais :) Je veux juste m'assurer que l'OP sache/apprenne. Pour ce que je sais, il aurait pu mettre un nom de variable dans le paramètre de type.

47voto

Stepoid Points 133

Pour tous ceux qui codent en Java pour les appareils Android et qui se retrouvent ici : utilisez SparseArray pour de meilleures performances;

private final SparseArray myMap = new SparseArray();

avec cela vous pouvez utiliser int au lieu d'Integer comme ceci;

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);

8 votes

Rappelez-vous que SparseArray est plus lent que hashmap, mais plus efficace en mémoire. Ainsi, ne l'utilisez pas sur de grands ensembles de données.

0 votes

Comment utiliser SparseArray pour de meilleures performances alors qu'il est plus lent ? Lequel utiliser dans mon jeu Android

0 votes

@Snake SparseArray Si vous allouez beaucoup de mémoire pour empaqueter et déballer des entiers comme vous le feriez avec une HashMap, la machine virtuelle devra arrêter l'exécution pour la collecte des déchets plus tôt. C'est important si vous essayez de faire quelque chose fréquemment et rapidement.

30voto

user1883212 Points 756

Vous ne pouvez pas utiliser un type primitif car HashMap utilise internalement un objet 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 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 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 rendre clair.

Je suggère d'utiliser un wrapper comme Integer et l'autoboxing.

5voto

Lakshmi Points 929

HashMap ne permet pas les types de données primitifs en tant qu'arguments. Il ne peut accepter que des objets donc

HashMap myMap = new HashMap();

ne fonctionnera pas.

Vous devez modifier la déclaration à

HashMap myMap = new HashMap();

donc même lorsque vous faites ce qui suit

myMap.put(2,myObject);

Le type de données primitif est autoboxé en un objet Integer.

8 (int) === boxing ===> 8 (Integer)

Vous pouvez en savoir plus sur l'autoboxing ici

4voto

alvinsj Points 585

Si vous codez en Android, il y a SparseArray, qui permet de faire correspondre un entier à un objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X