C# to Java - Dictionaries?

本文关键字:Dictionaries Java to | 更新日期: 2023-09-27 18:04:16

是否有可能在Java中使用已经在其中声明的项来创建字典?就像下面的c#代码:

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

我怎么做,我用什么类型?

C# to Java - Dictionaries?

这是你想要的:

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族。的方法。

使用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。条目是静态导入的,而不是显式引用的)。

除了只能使用Java 9+之外,这些新方法并不完全等同于前一种方法:

  • 他们不允许你指定使用什么Map实现
  • 它们只创建不可变映射
  • 他们不创建Map的匿名子类

但是,对于许多用例来说,这些差异应该无关紧要,因此对于新版本的Java来说,这是一种很好的默认方法。

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

咬紧牙关,输入地图名称!

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

Java7几乎引入了允许这样的语法的"集合字面量"。他们可能会把它塞进Java8。我不知道这些人有什么毛病。

这可以通过某种包装器API轻松实现

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

还不错。我更喜欢像

这样的字体
map("cat", "dog", ... )
.to(  1,     2,   ... );

这种东西肯定已经被不同的人实现了,不幸的是标准API不包括这样的东西