Estoy tratando de construir un HashMap que tendrá enteros como claves y objetos como valores.
Mi sintaxis es:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Sin embargo, el error devuelto es - Error de sintaxis en el token "int", Dimensiones esperadas después de este token - No entiendo por qué debería agregar una dimensión (es decir, convertir el int en una matriz) ya que solo necesito almacenar un dígito como clave.
¿Qué puedo hacer?
¡Gracias por adelantado! :)
HashMap
no maneja primitivas, solo objetos.int
siendo el valor, no la clave.Integer
lugar.Respuestas:
No puede usar una primitiva porque HashMap usa el objeto internamente para la clave. Por lo tanto, solo puede usar un objeto que herede de Object (es decir, cualquier objeto).
Esa es la función put () en HashMap y, como puede ver, usa Object for K:
La expresión "k = e.key" debería dejarlo claro.
Sugiero usar un contenedor como Integer y autoboxing.
fuente
Úselo en su
Integer
lugar.Java automáticamente encuadrará sus
int
valores primitivos paraInteger
objetos.Lea más sobre el autoboxing en la documentación de Oracle Java.
fuente
myObject
ArrayMap
oSimpleArrayMap
en Android para ahorrar memoria y aumentar el rendimiento ( Más información )Para todos los que codifican Java para dispositivos Android y terminan aquí: úselo
SparseArray
para un mejor rendimiento;con esto puedes usar int en lugar de Integer like;
fuente
SparseArray
Si asigna un montón de entradas de boxing y unboxing de memoria como lo haría con aHashMap
, la máquina virtual deberá pausar la ejecución para la recolección de basura antes. Esto es importante si está intentando hacer algo con frecuencia y rapidez.SparseArray
es O (n) (HashMap
tiene O (1) ). Es importante cuando el número de elementos es grande. La inserción al principio de dicha matriz es mucho más lenta.put()
tomaO(n)
(non log n
) para la inserción al inicio porque encuentra la posición y luego cambia todos los elementos siguientes.delete()
sí mismo tomaO(log n)
, pero la siguiente inserción o iteración a través de elementos después de eliminar requerirá una recolección de basura que tomaO(n)
.Puede intentar utilizar Trove http://trove.starlight-systems.com/
TIntObjectHashMap es probablemente lo que está buscando.
fuente
La razón principal por la que HashMap no permite primitivas como claves es que HashMap está diseñado de tal manera que para comparar las claves, utiliza equals () método , y un método puede ser llamado solo en un objeto, no en una primitiva.
Por lo tanto, cuando int se coloca automáticamente en Integer, Hashmap puede llamar al método equals () en el objeto Integer.
Por eso, debe usar Integer en lugar de int. Me refiero a que hashmap arroja un error al poner int como clave (no sé el significado del error que se arroja)
Y si piensa eso, puede hacer que el rendimiento de Map sea más rápido haciendo una primitiva como clave, hay una biblioteca llamada FastUtil que contiene una implementación de Map con el tipo int como clave.
Debido a esto, es mucho más rápido que Hashmap
fuente
Map<Integer, String>
enMap<Object, Object>
durante la compilación. Por cierto, hay IdentityHashMap que usa el==
operador para la verificación de igualdad, que aún no permite tipos primitivos.HashMap no permite tipos de datos primitivos como argumentos. Solo puede aceptar objetos
no trabajará.
Tienes que cambiar la declaración a
así que incluso cuando haces lo siguiente
El tipo de datos primitivo se coloca automáticamente en un objeto Integer.
Puede leer más sobre el autoboxing aquí http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
fuente
Si codifica en Android, existe SparseArray , que asigna un entero al objeto.
fuente
use int como Object no como tipo primitivo
fuente
-1
. A diferencia de lo que otros comentan antes de penalizar (yo no te -1).Por favor use
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
fuente
Una matriz también es un objeto, por lo que
HashMap<int[], MyObject>
es una construcción válida que usa matrices int como claves.El compilador no sabe lo que quiere o lo que necesita, solo ve una construcción de lenguaje que es casi correcta y advierte lo que falta para que sea completamente correcto.
fuente
Para alguien que esté interesado en un mapa de este tipo porque desea reducir la huella de autoboxing en Java de envoltorios sobre tipos primitivos, recomendaría usar colecciones de Eclipse . Trove ya no es compatible , y creo que es una biblioteca bastante poco confiable (aunque de todos modos es bastante popular) y no se puede comparar con las colecciones de Eclipse .
En este ejemplo anterior IntObjectHashMap .
Como necesita el mapeo int-> object , también considere el uso de
YourObjectType[]
matriz oList<YourObjectType>
valores de acceso por índice, ya que map es, por naturaleza, una matriz asociativa con el tipo int como índice.fuente