2009-06-22 7 views
8

Necesito almacenar información de clave/valor en algún tipo de colección. En C#, me defino un diccionario de esta manera:C# refugiado busca un poco de ayuda de colecciones Java

var entries = new Dictionary<string, int>(); 
entries.Add("Stop me", 11); 
entries.Add("Feed me", 12); 
entries.Add("Walk me", 13); 

entonces yo acceder a los valores de modo:

int value = entries["Stop me"]; 

¿Cómo puedo hacer esto en Java? He visto ejemplos con ArrayList, pero me gustaría la solución con genéricos, si es posible.

+1

C# refugiado? ¿No es eso un estado de pecado? :)) –

+0

Más como una epifanía :) – skaffman

+0

ArrayList es una secuencia o construcción similar a una lista (no es un diccionario), aunque es genérica –

Respuesta

22

Usted desea utilizar una nota Map

Map<String, Integer> m = new HashMap<String, Integer>(); 
m.put("Stop me", 11); 
Integer i = m.get("Stop me"); // i == 11 

que en la última línea, podría haber dicho:

int i = m.get("Stop me"); 

Que es la abreviatura de (con auto-unboxing de Java):

int i = m.get("Stop me").intValue() 

Si no hay ningún valor en el mapa en la clave especificada, el get devuelve null y esta expresión arroja un NullPointerException. Por lo tanto es siempre una buena idea utilizar la caja tipoInteger en este caso

2

Parece que usted está buscando algo así como HashMap

1

Definitivamente quiere un HashMap, que es la versión Java de C# Dictionary.

6

Utiliza un Map en Java.

Tenga en cuenta que no se puede utilizar int (o cualquier otro tipo primitivo) como un parámetro de tipo genérico, pero debido a autoboxing, todavía se comporta casi como si se tratara de un Map<String, int> en lugar de un Map<String, Integer>. (Usted no quiere estar haciendo un montón de autoboxing en el código sensibles al rendimiento, sin embargo.)

Map<String, Integer> entries = new HashMap<String, Integer>(); 
entries.put("Stop me", 11); 
entries.put("Feed me", 12); 
entries.put("Walk me", 13); 
int value = entries.get("Stop me"); // if you know it exists 
// If you're not sure whether the map contains a value, it's better to do: 
Integer boxedValue = entries.get("Punch me"); 
if (boxedValue != null) { 
    int unboxedValue = boxedValue; 
    ... 
} 
+0

Su última línea es peligrosa: si no hay ningún valor en el mapa en esa clave, lanzará una NullPointerException debido a su uso de unboxing –

+0

Sí, buen punto. Autoboxing es muy bueno, pero unboxing realmente no ayuda mucho. –

+0

Despliegue en la anotación @NotNull –

7

Utilice un java.util.Map. Hay varias implementaciones:

  • HashMap: O (1) las operaciones de búsqueda, no mantener el orden de las claves
  • TreeMap: O (log n) las operaciones de búsqueda, mantiene el orden de las llaves, por lo que puede iterar sobre ellos en una orden garantizada
  • LinkedHashMap: O (1) búsqueda, itera sobre las teclas en el orden en que se agregaron al mapa.

de usarlos como:

Map<String,Integer> map = new HashMap<String,Integer>(); 
map.put("Stop me", 11); 
map.put("Feed me", 12); 

int value = map.get("Stop me"); 

Para mayor comodidad de trabajo con las colecciones, echar un vistazo a la Google Collections library. Es excelente.

+0

Repita comentario: Su última línea es peligrosa: si no hay ningún valor en el mapa en esa clave, lanzará una NullPointerException debido a su uso de unboxing –

+0

+1 para explicación sobre implementaciones de Map – dfa

+0

There es un valor en el mapa con esa clave! Pero para aclarar, primero debe verificar si falta una clave llamando al método contains del mapa y/o verificar que el resultado de get (key) no sea nulo. Esto último es menos probable, ya que es una práctica pobre pasar reflexiones entre objetos. – Nat

1
Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("Stop Me", 11); 
map.put("Feed Me", 12); 
map.put("Walk Me", 13); 
Integer x; // little hack 
int value = (x = a.get("aaa")) == null? 0 : x; 

como alternativa se puede tratar de enumeración:

enum Action { 

    STOP(11), 
    FEED(12), 
    WALK(13); 

    private final int value; 

    private Action(int value) { 
     this.value = value; 
    } 

    public int value() { 
     return value; 
    } 

    public static Action valueOf(int value) { 
     for (Action action : values()) { 
      if (action.value == value) { 
       return action; 
      } 
     } 

     return null; // or a null-object 
    } 
} 

prueba:

public void action() { 
    Action action = Action.valueOf("FEED"); 
    // or Action.FEED for more compile-time safety 
    int value = action.value(); 
    // instantiating by code 
    Action walk = Action.valueOf(13); 
} 
+1

Repetir comentario: si no hay ningún valor en el mapa en esa clave, arrojará una NullPointerException debido a su uso de unboxing –

+0

buen punto, usando un tipo de recuadro debería ser mejor – dfa

+0

Esperemos que el usuario tenga nombres que son identificadores legales de Java. – akarnokd

Cuestiones relacionadas