web-dev-qa-db-fra.com

C # à Java - Dictionnaires?

Est-il possible en Java de faire un dictionnaire avec les éléments déjà déclarés à l'intérieur? Tout comme le code C # ci-dessous:

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

Comment dois-je procéder et quel type dois-je utiliser? J'ai lu que le dictionnaire est obsolète.

51
WildBamaBoy

Cela fera ce que vous voulez:

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

Cette instruction crée une sous-classe anonyme de HashMap, où la seule différence avec la classe parente est que les 4 entrées sont ajoutées lors de la création de l'instance. C'est un idiome assez courant dans le monde Java (bien que certains le trouvent controversé car il crée une nouvelle définition de classe).

En raison de cette controverse, à partir de Java 9, il existe un nouvel idiome pour construire facilement des cartes: la famille des statiques méthodes Map.of .

Avec Java 9 ou supérieur, vous pouvez créer la carte dont vous avez besoin comme suit:

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

Avec des cartes plus grandes, cette syntaxe alternative peut être moins sujette aux erreurs:

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

(C'est particulièrement bien si Map.entry est importé statiquement au lieu d'être référencé explicitement).

En plus de travailler uniquement avec Java 9+, ces nouvelles approches ne sont pas tout à fait équivalentes à la précédente:

  • Ils ne vous permettent pas de spécifier quelle implémentation de carte est utilisée
  • Ils ne créent que des cartes immuables
  • Ils ne créent pas une sous-classe anonyme de Map

Cependant, ces différences ne devraient pas avoir d'importance pour de nombreux cas d'utilisation, ce qui en fait une bonne approche par défaut pour les nouvelles versions de Java.

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

Mordez la balle et tapez le nom de la carte!

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

Vous pouvez également faire quelque chose comme ceci, ce qui pourrait économiser de la frappe avec une longue liste:

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

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

Si vous utilisez la bibliothèque Guava , vous pouvez utiliser sa classe ImmutableMap, soit seule (exemples 1 et 2), soit comme initialiseur pour un HashMap (exemples 3 et 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)
);
3
Sean Patrick Floyd