C#到Java - 字典?

Wil*_*Boy 51 c# java dictionary map new-operator

在Java中是否可以使用已经在其中声明的项来创建一个Dictionary?就像下面的C#代码一样:

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

我该怎么做以及我使用什么类型的?我读过字典已经过时了.

Sea*_*lly 74

这将做你想要的:

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

此语句创建HashMap的匿名子类,其中与父类的唯一区别是在实例创建期间添加了4个条目.它在Java世界中是一个相当普遍的习惯用法(虽然有些人发现它有争议,因为它创建了一个新的类定义).

由于这种争议,从Java 9开始,有一种新的习惯用法可以方便地构建地图:静态Map.of方法的族.

使用Java 9或更高版本,您可以创建所需的地图,如下所示:

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

对于较大的映射,此替代语法可能不太容易出错:

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

(如果静态导入Map.entry而不是显式引用,这尤其好用).

除了仅使用Java 9+之外,这些新方法与前一种方法并不完全相同:

  • 它们不允许您指定使用的Map实现
  • 他们只创建不可变的地图
  • 它们不会创建Map的匿名子类

但是,这些差异对于许多用例而言并不重要,这使得它成为较新版本Java的一种很好的默认方法.

  • 这是对这是做什么的解释.http://techpolesen.blogspot.com/2007/08/java-initializers-add-elements-to.html (2认同)
  • 额外的牙箍不是风格的东西.它们都是功能性的,必须将代码表示为初始化块. (2认同)

fir*_*w52 12

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


Lui*_*hys 5

咬一下子弹,然后输入地图名称!

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

您还可以执行以下操作,这可以节省一些带有长列表的输入:

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

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