2011-07-31 11 views
47

Javaで、その中にすでに宣言されている項目で辞書を作成することは可能ですか?ちょうど下のC#コードのように:C#to Java - Dictionaries?

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

どのように私はどのようなタイプを使用しますか?私は辞書が時代遅れであることを読んだ。

答えて

68

これは、あなたがやりたいことになります。

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

この文は、親クラスからの唯一の違いは、4つのエントリは、インスタンスの作成時に追加されていることであるHashMapの、匿名のサブクラスを作成します。これは、Javaの世界ではかなり一般的なイディオムです(新しいクラス定義を作成するために議論の余地があります)。

この論争のため、Java 9の時点で便利に地図を構築するための新しいイディオムがあります。スタティックMap.of methodsのファミリです。

のJava 9で

以上あなたは次のようにあなたが必要とするマップを作成することができます大きなマップで

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

を、このalternative syntaxが少ないエラーが発生しやすいことがあります

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

(これは特にですMap.entryが明示的に参照されるのではなく、静的にインポートされているといいです)。

だけのJava 9+での作業に加えて、これらの新しいアプローチは、以前のものとは全く等価ではありません。

  • 、彼らは唯一不変作成するには、
  • を使用しているもの地図の実装を指定することはできません。マップ
  • 彼らはしかし、これらの違いは、このための適切なデフォルトのアプローチを作り、多くのユースケースでは問題ないはず地図

の匿名のサブクラスを作成しないでください新しいバージョンのJava

+0

実際にそれがありません。ありがとう。 – WildBamaBoy

+2

そして、これが何をしているのかについての説明があります。あなたは正しい@Luigi http://techpolesen.blogspot.com/2007/08/java-initializers-add-elements-to.html –

+0

うーん...ダブル括弧構文は、一般的にI'LL、良いスタイル –

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

誰かがすでにこの投稿をしています... – fireshadow52

+0

これは編集されません。 – Affe

4

地図の名前を入力してください。

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

また、長いリストでいくつかのタイピングを節約する可能性がある。このような何か、何ができる:

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

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

いいえ!あまりにも多くの入力。 :P – WildBamaBoy

0

Java7はほとんどそのような構文を可能にする「コレクションリテラル」を導入しました。彼らはおそらくJava8でそれを押してしようとします。私はこれらの人々に何が間違っているのか分かりません。

この

は簡単

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

悪くないラッパーAPIのいくつかの種類によって達成することができます。

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

この種のものは、いろいろな人によって実装されていなければならず、残念なことに標準APIはそのようなことをしません。

3

もしGuava libraryを使用する場合は、いずれか単独で(実施例1及び2)、またはハッシュマップの初期化子(実施例3及び4)のように、そのImmutableMapクラスを使用することができます。

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