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}
};
我怎么做,我用什么类型?
这是你想要的:
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不包括这样的东西