2011-07-31 17 views
47

¿Es posible en Java hacer un diccionario con los elementos ya declarados dentro de él? Al igual que el siguiente código C#:C# a Java - ¿Diccionarios?

Dictionary<string, int> d = new Dictionary<string, int>() 
    { 
     {"cat", 2}, 
     {"dog", 1}, 
     {"llama", 0}, 
     {"iguana", -1} 
    }; 

¿Cómo hago esto y qué tipo de uso utilizo? He leído que el diccionario está obsoleto.

Respuesta

68

Esto va a hacer lo que quiere:

Map<String,Integer> map = new HashMap<String, Integer>(){{ 
    put("cat", 2); 
    put("dog", 1); 
    put("llama", 0); 
    put("iguana", -1); 
}}; 

Esta sentencia crea una subclase anónima de HashMap, donde la única diferencia con respecto a la clase padre es que se añaden las 4 entradas durante la creación de la instancia. Es una expresión bastante común en el mundo de Java (aunque a algunos les resulta controvertido porque crea una nueva definición de clase).

Debido a esta controversia, a partir de Java 9 hay un nuevo lenguaje para la construcción de mapas convenientemente: la familia de estática Map.of methods.

Con Java 9 o superior puede crear el mapa que necesita de la siguiente manera:

Map<String, Integer> map = Map.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1 
); 

Con mapas más grandes, esto alternative syntax puede ser menos propenso a errores:

Map<String, Integer> map = Map.ofEntries(
    Map.entry("cat", 2), 
    Map.entry("dog", 1), 
    Map.entry("llama", 0), 
    Map.entry("iguana", -1) 
); 

(Esto es especialmente agradable si Map.entry se importa estáticamente en lugar de estar referenciado explícitamente).

Además de trabajar sólo con Java 9+, estos nuevos enfoques no son del todo equivalente a la anterior:

  • que no le permiten especificar qué aplicación se utiliza Mapa
  • Ellos sólo crean inmutable mapas
  • no crean una subclase anónima de Mapa

sin embargo, estas diferencias no deberían tener importancia para muchos casos de uso, haciendo de esta una buena aproximación por defecto para versiones más nuevas de Java.

+0

hecho lo hace . Gracias. – WildBamaBoy

+2

Y aquí hay una explicación de lo que está haciendo esto. http://techpolesen.blogspot.com/2007/08/java-initializers-add-elements-to.html –

+0

Hmmm ... la sintaxis de dobles llaves generalmente no se considera un buen estilo –

12
Map<String,Integer> map = new HashMap<String, Integer>(){{ 
put("cat", 2); 
put("dog", 1); 
put("llama", 0); 
put("iguana", -1); 
}}; 
+0

Wow alguien ya publicó esto ... – fireshadow52

+0

Esto no se compila, su respuesta fue correcta antes de editarla. – Affe

4

de tripas corazón y escriba el nombre del mapa!

Map<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("cat", 2); 
    map.put("dog", 1); 
    map.put("llama", 0); 
    map.put("iguana", -1); 

También podría hacer algo como esto, lo que podría ahorrar algo de mecanografía con una larga lista:

Object[][] values = { 
     {"cat", 2}, 
     {"dog", 1}, 
     {"llama", 0}, 
     {"iguana", -1} 
    }; 

    for (Object[] o : values) { 
     map.put((String) o[0], (Integer) o[1]); 
    } 
+1

¡De ninguna manera! Demasiado tipeo :PAG – WildBamaBoy

0

Java7 casi literales introdujo "colección" que permitirían la sintaxis de esa manera. Probablemente intentarán meterlo en Java8. No tengo idea de qué está mal con esta gente.

Esto se puede lograr fácilmente por algún tipo de envoltorio de API

Map<String,Integer> map = Maps.<String,Integer>empty() 
    .put("cat", 2).put("dog",1)....; 

No está mal. Yo preferiría algo así como

map("cat", "dog", ...) 
.to( 1,  2, ...); 

Este tipo de cosas debe haber sido implementado por varias personas, por desgracia, el API estándar no inculde tales cosas.

3

Si utiliza la Guava library, puede utilizar su clase ImmutableMap, bien por sí mismo (ejemplos 1 y 2), o como un inicializador para una HashMap (ejemplos 3 y 4):

Map<String, Integer> map1 = ImmutableMap.<String, Integer> builder() 
    .put("cat", 2) 
    .put("dog", 1) 
    .put("llama", 0) 
    .put("iguana", -1) 
    .build(); 
Map<String, Integer> map2 = ImmutableMap.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1 
); 
Map<String, Integer> map3 = Maps.newHashMap(
    ImmutableMap.<String, Integer> builder() 
    .put("cat", 2) 
    .put("dog", 1) 
    .put("llama", 0) 
    .put("iguana", -1) 
    .build() 
); 
Map<String, Integer> map4 = Maps.newHashMap(ImmutableMap.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1) 
);