web-dev-qa-db-de.com

C # to Java - Wörterbücher?

Ist es in Java) möglich, ein Wörterbuch mit den bereits darin deklarierten Elementen zu erstellen? Genau wie im folgenden C # -Code:

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

Wie mache ich das und welchen Typ verwende ich? Ich habe gelesen, dass Dictionary veraltet ist.

51
WildBamaBoy

Dies wird tun, was Sie wollen:

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

Diese Anweisung erstellt eine anonyme Unterklasse von HashMap. Der einzige Unterschied zur übergeordneten Klasse besteht darin, dass die 4 Einträge während der Instanzerstellung hinzugefügt werden. In der Java) - Welt ist dies eine ziemlich verbreitete Redewendung (obwohl manche dies kontrovers finden, weil dadurch eine neue Klassendefinition erstellt wird).

Aufgrund dieser Kontroverse gibt es ab Java 9 eine neue Redewendung für die bequeme Erstellung von Karten: die Familie der statischen Map.of-Methoden .

Mit Java 9 oder höher können Sie die benötigte Karte wie folgt erstellen:

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

Bei größeren Karten ist diese alternative Syntax möglicherweise weniger fehleranfällig:

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

(Dies ist besonders hilfreich, wenn Map.entry statisch importiert wird, anstatt explizit referenziert zu werden.).

Abgesehen davon, dass nur mit Java 9+ gearbeitet wird, entsprechen diese neuen Ansätze nicht ganz den vorherigen:

  • Sie können nicht angeben, welche Map-Implementierung verwendet wird
  • Sie erstellen nur unveränderliche Karten
  • Sie erstellen keine anonyme Unterklasse von Map

Diese Unterschiede sollten jedoch für viele Anwendungsfälle keine Rolle spielen, sodass dies ein guter Standardansatz für neuere Versionen von Java ist.

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

Beißen Sie die Kugel und tippen Sie den Kartennamen aus!

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

Sie könnten auch so etwas tun, was das Tippen mit einer langen Liste ersparen könnte:

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

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

Wenn Sie die Guava-Bibliothek verwenden, können Sie die Klasse ImmutableMap entweder für sich (Beispiele 1 und 2) oder als Initialisierer für eine HashMap (Beispiele 3 und 4) verwenden:

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

Java7 führte fast "Sammlungsliterale" ein, die eine solche Syntax erlauben würden. Sie werden wahrscheinlich versuchen, es in Java8 zu schieben. Ich habe keine Ahnung, was mit diesen Leuten los ist.

Dies kann leicht durch eine Art Wrapper-API erreicht werden

Map<String,Integer> map = Maps.<String,Integer>empty()
    .put("cat", 2).put("dog",1)....; 

Nicht so schlecht. Ich würde sowas vorziehen

map("cat", "dog", ... )
.to(  1,     2,   ... );

Diese Art von Dingen muss von verschiedenen Leuten implementiert worden sein, leider beinhaltet die Standard-API solche Dinge nicht.

0
irreputable