2010-12-09 21 views
6

Quiero crear una asignación que tome como clave String y una primitiva como valor. Estaba mirando los documentos de Java y no vi que Primitive fuera un tipo de clase, o que compartieran algún tipo de clase de ajuste.Asignaciones y primitivas de Java

¿Cómo puedo restringir el valor para que sea primitivo?

Map<String, Primitive> map = new HashMap<String, Primitive>();

+0

Fue mi culpa por no estar clara. Lo que digo Quiero restringir el valor a ser un tipo primitivo, quiero decir que quiero permitir que cualquiera de los tipos primitivos se use como un valor en ese mapa específico. – Prospero

Respuesta

7

Java Autoboxing permite crear mapas en Long, Integer, Double y luego operarlos utilizando valores primitivos. Por ejemplo:

java.util.HashMap<String, Integer> map = new java.util.HashMap<String, Integer>(); 
map.put("one", 1); // 1 is an integer, not an instance of Integer 

Si desea almacenar en un mapa diferentes tipos primitivos, que pueda para que haciendo una Map<String, Number>. Permite almacenar los valores de BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short (y AtomicLong, AtomicInteger).

Aquí se muestra un ejemplo:

Map<String, Number> map = new HashMap<String, Number>(); 

map.put("one", 1); 
map.put("two", 2.0); 
map.put("three", 1L); 

for(String k:map.keySet()) { 
    Number v = map.get(k); 
    System.err.println(v + " is instance of " + v.getClass().getName() + ": " + v); 
} 
+0

¿Existe alguna forma con los genéricos para especificar una o una cláusula? Diga por ejemplo Prospero

+0

@Doodle debes hacer una clase base 'Vehicle' y extenderla en' Boat, Car' y luego hacer ''. – khachik

+1

Sí, extrae un Supertipo de Vehículo y lo convierte en un Mapa o Mapa (la sintaxis de Generics siempre me confunde) – ivy

2

Usted puede hacer lo siguiente:

Map<String, Integer> map = new HashMap<String, Integer>() 

Entonces operaciones como:

map.put("One", 1); 

va a funcionar. La primitiva 1 se autoencapsará en un Integer. De la misma manera:

int i = map.get("One"); 

también funcionará porque el Integer obtendrá automáticamente sin embalaje en una int.

Consulte algunos documentos en autoboxing and autounboxing.

+1

'Map' es una interfaz. – khachik

+0

El mapa es una interfaz .. –

+0

@khacik, arreglado. Gracias por señalar eso. – jjnguy

2

Cada primitiva tiene una clase contenedora, como java.lang.Long para long.

Así puede asignar la clase a la envoltura String y, si se utiliza Java 1.5+, en pocas palabras primitivas al mapa:

Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("key", 10); 
int value = map.get("key"); // value is 10. 
1

que usaría su contraparte en caja.

Map<String,Integer> map = new HashMap<String,Integer>(); 

Entero es un tipo de caja inmutable de la primitiva int. Hay tipos similares en corto, largo, doble, flotante y en byte.

0

No puede tener una primitiva como clave o valor en la interfaz Map. En su lugar, puede utilizar las clases Wrapper, como Integer, Character, Boolean y así sucesivamente.

Obtenga más información en wiki.

+0

El autoenlace debería ocuparse de eso si se usa Java 1.5 en adelante, por lo que no es necesario envolver las primitivas manualmente. – dimitrisli

4

Google de "Java Mapas primitivo" y encontrará algunos tipos especializados que evitan la necesidad de autoboxing.Un ejemplo de esto es: https://labs.carrotsearch.com/hppc.html

Sin embargo, en general debería funcionar bien con el autoboxing como se menciona en otras respuestas.

+0

Eso es un bache para mostrarme Fast util eso es algo que puede ser útil para mí, gracias. – Prospero

+0

El enlace está muerto. – ppasler

+0

He reemplazado el enlace inactivo con uno actualizado – mchr

1

Si necesita que el valor sea primitivo por motivos de rendimiento, puede usar TObjectIntHashMap o similar.

p. Ej.

TObjectIntHashMap<String> map = new TObjectIntHashMap(); 

map.put("key", 10); 
int value = map.get("key"); 

Una diferencia con Mapa < String, Integer> es que los valores de tipo int primitivo lugar de objeto Integer.

Cuestiones relacionadas