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

92
demandé sur MrD 2013-04-22 17:39:52

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.

13
répondu user1883212 2013-04-22 14:02:46

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.

120
répondu gaborsch 2013-04-22 16:28:03

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);
36
répondu Stepoid 2013-12-08 15:06:01

vous pouvez essayer D'utiliser le Trove http://trove.starlight-systems.com/

TIntObjectHashMap est probablement ce que vous recherchez.

4
répondu Arek 2013-12-18 09:55:36

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

3
répondu Lakshmi 2013-04-22 14:04:37

si vous codez pour Android, il y a SparseArray , mapping integer to object.

3
répondu alvinsj 2013-08-28 07:06:23

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

2
répondu FatherMathew 2015-09-30 12:32:41

utiliser des int comme Objet, non pas comme un type de primitive

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
1
répondu franki3xe 2013-04-22 13:48:41

s'il vous plaît utiliser HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

0
répondu Michael 2013-04-22 13:42:39

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.

0
répondu Yoory N. 2017-12-05 06:39:31