Question

Je dois stocker les informations clé / valeur dans un type de collection. En C #, je définirais un dictionnaire comme ceci:

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

Ensuite, j'accédais aux valeurs de manière:

int value = entries["Stop me"];

Comment puis-je faire cela en Java? J'ai vu des exemples avec ArrayList, mais j'aimerais si possible une solution avec des génériques.

Était-ce utile?

La solution

Vous voulez utiliser un Map

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

Notez que sur la dernière ligne, j'aurais pu dire:

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

Quel est le raccourci pour (avec le décompactage automatique de Java):

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

S'il n'y a pas de valeur dans la carte à la clé donnée, le get retourne null et cette expression renvoie un NullPointerException. Par conséquent, il est toujours préférable d'utiliser le type en boîte Integer dans ce cas

.

Autres conseils

Utilisez un java.util.Map. Il existe plusieurs implémentations:

  • HashMap: Recherche O (1), ne conserve pas l'ordre des clés
  • TreeMap: La recherche O (log n) maintient l'ordre des clés afin que vous puissiez les parcourir dans un ordre garanti
  • LinkedHashMap: La recherche O (1) itère sur les clés dans l'ordre dans lequel elles ont été ajoutées à la carte.

Vous les utilisez comme:

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

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

Pour plus de commodité avec les collections, consultez la bibliothèque Google Collections C'est excellent.

Vous utilisez un Map en Java.

Notez que vous ne pouvez pas utiliser int (ou tout autre type de primitive) comme paramètre de type générique, mais en raison de la sélection automatique, il se comporte toujours presque comme s'il s'agissait d'un Map<String, int> au lieu d'un Map<String, Integer>. (Cependant, vous ne voulez pas faire beaucoup de auto-sélection dans du code sensible à la performance.)

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

Il semble que vous recherchiez quelque chose comme 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;

Comme alternative, vous pouvez essayer 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);
}

Vous voulez vraiment un HashMap, qui est la version Java de C # Dictionary.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top