HashMap e int come chiave

Sto cercando di creare una HashMap che avrà un numero intero di chiavi e oggetti come valori.

La mia syntax è:

HashMap myMap = new HashMap(); 

Tuttavia, l’errore restituito è – Errore di syntax sul token “int”, Dimensioni previste dopo questo token – Non capisco perché dovrei aggiungere una dimensione (ad esempio: creare l’int in una matrice) poiché devo solo memorizzare una cifra come chiave.

Cosa potevo fare?

Grazie in anticipo! 🙂

Non è ansible utilizzare una primitiva perché HashMap utilizza l’object internamente per la chiave. Quindi puoi utilizzare solo un object che eredita da Object (ovvero qualsiasi object).

Questa è la funzione put () in HashMap e come puoi vedere usa 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 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’espressione “k = e.key” dovrebbe essere chiara.

Suggerisco di usare un wrapper come Integer e Autoboxing.

Utilizzare invece l’ Integer .

 HashMap myMap = new HashMap(); 

Java automaticamente autobox i tuoi valori primitivi int in oggetti Integer .

Ulteriori informazioni su Autoboxing da documentazione Oracle Oracle.

Per tutti coloro che codifica Java per dispositivi Android e finisce qui: usa SparseArray per prestazioni migliori

 private final SparseArray myMap = new SparseArray(); 

con questo puoi usare int invece di Integer come

 int newPos = 3; myMap.put(newPos, newObject); myMap.get(newPos); 

Puoi provare a usare Trove http://trove.starlight-systems.com/
TIntObjectHashMap è probabilmente quello che stai cercando.

HashMap non consente tipi di dati primitivi come argomenti. Può solo accettare oggetti così

 HashMap myMap = new HashMap(); 

non funzionerà.

Devi cambiare la dichiarazione a

 HashMap myMap = new HashMap(); 

quindi anche quando fai quanto segue

 myMap.put(2,myObject); 

Il tipo di dati primitivi è autoboxato su un object intero.

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

Puoi leggere ulteriori informazioni sull’autoboxing qui http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

Se esegui il codice in Android, c’è SparseArray , che mappa il numero intero dell’object.

Il motivo principale per cui HashMap non consente le chiavi primitive è che HashMap è progettato in modo tale che per confrontare le chiavi, fa uso del metodo equals () e un metodo può essere chiamato solo su un object non su una primitiva.

Pertanto, quando int è autoboxed su Integer, Hashmap può chiamare il metodo equals () sull’object Integer.

Ecco perché, dovresti usare Integer invece di int. Voglio dire hashmap genera un errore mentre inserisci int come una chiave (non so il significato dell’errore che viene generato)

E se pensi che, puoi rendere le prestazioni della mappa più rapide trasformando una primitiva in una chiave, esiste una libreria chiamata FastUtil che contiene un’implementazione di Map con tipo int come chiave.

Per questo motivo è molto più veloce di Hashmap

usa int come Object non come tipo primitivo

 HashMap myMap = new HashMap(); 

Si prega di utilizzare HashMap myMap = new HashMap();

Non capisco perché dovrei aggiungere una dimensione (cioè: creare l’int in una matrice) poiché devo solo memorizzare una cifra come chiave.

Un array è anche un object, quindi HashMap è un costrutto valido che utilizza gli array int come chiavi.

Il compilatore non sa cosa vuoi o cosa ti serve, vede solo un costrutto linguistico quasi corretto e avverte quello che manca perché sia ​​completamente corretto.