2009-06-22 5 views
8

Ho bisogno di memorizzare informazioni chiave/valore in qualche tipo di raccolta. In C#, mi definisco un dizionario come questo:Il rifugiato C# cerca un po 'di aiuto per le raccolte Java

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

Poi vorrei accedere ai valori così:

int value = entries["Stop me"]; 

Come faccio a fare questo in Java? Ho visto esempi con ArrayList, ma mi piacerebbe la soluzione con i generici, se possibile.

+1

C# rifugiato? Non è uno stato di peccato? :)) –

+0

Più simile a un'epifania :) – skaffman

+0

ArrayList è una sequenza o un costrutto tipo elenco (non un dizionario), sebbene sia generico –

risposta

22

Si desidera utilizzare un Map

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

Si noti che l'ultima riga, avrei potuto dire:

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

Che è abbreviazione (con auto-unboxing di Java):

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

Se non c'è alcun valore nella mappa con il tasto dato, lo get restituisce null e questa espressione genera uno NullPointerException. Quindi è sempre una buona idea di utilizzare il tipo scatolatoInteger in questo caso

2

Sembra che siete alla ricerca di qualcosa di simile HashMap

1

Sicuramente si desidera un HashMap, che è la versione Java di C# Dictionary.

6

Si utilizza un Map in Java.

Si noti che non è possibile utilizzare int (o qualsiasi altro tipo primitivo) come un parametro di tipo generico, ma a causa di autoboxing, si comporta ancora quasi come se si trattasse di un Map<String, int> invece di un Map<String, Integer>. (Non si vuole fare un sacco di autoboxing nel codice prestazioni sensibili, però.)

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

L'ultima riga è pericolosa: se non c'è alcun valore nella mappa su quella chiave, getterà una NullPointerException a causa dell'uso di unboxing –

+0

Sì, buon punto. Autoboxing è molto bello, ma unboxing non aiuta molto. –

+0

Roll sull'annotazione @NotNull –

7

Utilizzare un java.util.Map. Ci sono diverse implementazioni:

  • HashMap: O (1) di ricerca, non mantenere l'ordine delle chiavi
  • TreeMap: O (log n) di ricerca, al fine di chiavi sostiene, in modo da poter scorrere su di loro in un ordine garantito
  • LinkedHashMap: O (1) ricerca, itera su chiavi nell'ordine in cui sono stati aggiunti alla mappa.

di usarli come:

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

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

Per una maggiore comodità di lavoro con le collezioni, avere uno sguardo alla Google Collections library. È eccellente

+0

Commento di ripetizione: l'ultima riga è pericolosa: se non c'è alcun valore nella mappa su quel tasto, verrà generata una NullPointerException a causa dell'uso di unboxing –

+0

+1 per spiegazioni sulle implementazioni di Map – dfa

+0

Là è un valore nella mappa con quella chiave! Ma per chiarire, per prima cosa verificherete la presenza di una chiave mancante chiamando il metodo contains della mappa e/o verificando che il risultato di get (chiave) non sia nullo. Quest'ultimo è meno probabile, dal momento che è una pratica inadeguata passare tra gli oggetti. – 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; 

in alternativa si può provare Enum:

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 
    } 
} 

prova:

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

Commento di ripetizione: la tua ultima riga è pericolosa: se non c'è alcun valore nella mappa su quel tasto, verrà lanciata una NullPointerException a causa dell'uso del tuo unboxing –

+0

buon punto, usare un tipo di box dovrebbe essere migliore – dfa

+0

Speriamo che l'utente abbia nomi che sono identificatori java legali. – akarnokd