Domanda

Devo memorizzare le informazioni chiave / valore in un tipo di raccolta. In C #, definirei un dizionario come questo:

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

Quindi vorrei accedere ai valori in questo modo:

int value = entries["Stop me"];

Come posso farlo in Java? Ho visto esempi con ArrayList, ma mi piacerebbe la soluzione con generici, se possibile.

È stato utile?

Soluzione

Desideri utilizzare un Map

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

Nota che sull'ultima riga avrei potuto dire:

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

Che è una scorciatoia per (con l'auto-unboxing di Java):

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

Se non è presente alcun valore nella mappa in corrispondenza della chiave specificata, get restituisce null e questa espressione genera un NullPointerException. Quindi è sempre una buona idea usare il tipo in scatola Integer in questo caso

Altri suggerimenti

Usa un java.util.Map. Esistono diverse implementazioni:

  • HashMap: O (1) ricerca, non mantiene l'ordine delle chiavi
  • TreeMap: O (log n) ricerca, mantiene l'ordine delle chiavi, in modo da poter scorrere su di esse in un ordine garantito
  • LinkedHashMap: O (1) ricerca, scorre le chiavi nell'ordine in cui sono state aggiunte alla mappa.

Li usi 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 maggiore praticità nel lavorare con le raccolte, dai un'occhiata alla Biblioteca di Google Collections . È eccellente.

Si utilizza un Map in Java.

Nota che non puoi usare int (o qualsiasi altro tipo primitivo) come parametro di tipo generico, ma a causa del box automatico, si comporta comunque quasi come se fosse un Map<String, int> anziché un Map<String, Integer>. (Tuttavia, non si desidera eseguire un sacco di autoboxing nel codice sensibile alle prestazioni.)

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

Sembra che tu stia cercando qualcosa come HashMap

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

Test:

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

Volete sicuramente un HashMap, che è la versione Java di C # Dictionary.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top