web-dev-qa-db-ja.com

C#to Java-辞書?

Javaでは、その中にすでに宣言されている項目で辞書を作成できますか?以下のC#コードのように:

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

これをどのように行い、どのタイプを使用しますか?辞書は時代遅れだということを読みました。

51
WildBamaBoy

これはあなたが望むことをします:

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

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

この論争のため、Java 9の時点で、マップを便利に構築するための新しいイディオムがあります:静的ファミリー Map.ofメソッド

Java 9以上では、次のように必要なマップを作成できます。

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

より大きなマップでは、この 代替構文 の方がエラーが少なくなります。

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+でのみ動作することに加えて、これらの新しいアプローチは前のアプローチとまったく同等ではありません。

  • 使用するMap実装を指定することはできません
  • 不変のマップのみを作成します
  • Mapの匿名サブクラスは作成しません

ただし、これらの違いは多くのユースケースでは重要ではないため、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

弾丸をかみ、マップ名を入力してください!

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

Guavaライブラリ を使用する場合、そのImmutableMapクラスを単独で(例1および2)、またはHashMapの初期化子として(例3および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

Java7は、そのような構文を許可する「コレクションリテラル」をほぼ導入しました。彼らはおそらくJava8でそれを突き出そうとするでしょう。私はこれらの人々の何が悪いのか分かりません。

これは、ある種のラッパーAPIによって簡単に実現できます。

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

悪くない。私は次のようなものを好むだろう

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

この種のことはさまざまな人々によって実装されたに違いありませんが、残念ながら標準APIはそのようなことを教えていません。

0
irreputable