Java - 是否可以在一行代码中向地图中的地图添加键/值?

时间:2009-09-01 15:27:36

标签: java maps

我有HashMap 1,它包含5个键,所有键都有Hashmaps作为值。我想为这些子地图添加键/值对。

map1.get(subCategoryMap).put(newKey, newValue); 

我的想法是:

map1.get(subCategoryMap);

返回另一张地图。我可以将这一行拆分成两行并具有:

map2 = map1.get(subCategoryMap);
map2.put(newKey, newValue);

但我更愿意一步到位。这就是我尝试的原因

map1.get(subCategoryMap).put(newKey, newValue); 

这不起作用(不喜欢对象上的.put())。是否可以访问子地图并在我上面的相同代码行中添加,或者我需要将其拆分为2行?

8 个答案:

答案 0 :(得分:14)

使用泛型,您可以:

Map<String, Map<String, String>> map1 = ...
map1.get(category).put(subcategory, value);

如果地图不是通用的:

Map map1 = ...
((Map)map1.get(category)).put(subcategory, value);

答案 1 :(得分:9)

((Map)map1.get(subCategoryMap)).put(newKey, newValue);

或者,使用泛型:

Map<X, Map<Y,Z>> map1;

...

map1.get(subCategoryMap).put(newKey, newValue);

但是,如果NullPointerException不包含map1的映射,则这两种技术都会失败subCategoryMap

答案 2 :(得分:3)

撇开(我会发表评论,但我认为会有点长)......

程序员能够在一行上获得单个概念操作感觉非常好。对于程序员(当时)来说,它感觉更具可读性,逻辑性和恰到好处。

这几乎从来都不是一件好事。一方面,后来解析比两行更难 - 即使你现在的直觉反应是它更具可读性。此外 - 一行上的操作越多,调试就越困难。

为了便于阅读,我认为Generics解决方案与我在单行上的解决方案差不多 - 对于铸造解决方案,我将其分解为两行;如果其中一个参数是操作而不是简单的变量,我也会将其分解为多行。

我知道很多人不会同意这一点,并告诉你实话我一开始往往会在一条线上放一点,但我注意到的是,在第一次出现问题或任何问题时混乱,它使我的生活更容易被打破到具有明确命名变量的单独陈述。

至少同样重要 - 在嵌套集合的情况下,我经常将集合包装在不同的对象中。在你的情况下这会很有趣 - 通话会变得更加清晰。

dataHolder.put(category, newKey, newVale);

隐藏集合嵌套的机制(否则可能很复杂,无法正确记住并且易于搞砸)并使您的意图更加清晰。

这种包装模式(不扩展但封装)嵌套集合起初感觉很奇怪,但我真的建议你试一试 - 它真的清理了很多代码,使一切更安全,增加了每个人的理解,变化一个业务对象的“集合”(您可以在其中放置业务方法 - 几乎可以立即升级的重构),并且通常可以帮助您的代码。

答案 3 :(得分:0)

如果您没有使用Generics,那么HashMap会将键和值存储并检索为Object,因此您可能需要进行强制转换,如下所示:

((HashMap)map1.get(subCategoryMap)).put(newKey, newValue);

但是,如果您提供更多代码,将会有所帮助。

答案 4 :(得分:0)

如果您使用通用集合,那么您的代码应该按照书面形式工作。否则,您需要将适当的强制转换添加到单行中。

答案 5 :(得分:0)

只要map1被声明为Map<OuterKey, Map<InnerKey, MyValue>>,就可以使用一行内容。但是,如果subCategoryMap中不存在map1,则需要注意的事项 - 单行会引发NullPointerException

答案 6 :(得分:0)

您可以使用((HashMap)map1.get(subCategoryMap)).put(newKey, newValue);

此外,如果您使用的是Java 5或Java 6,则可以使用泛型来避免HashMap中的强制转换

答案 7 :(得分:0)

如果您使用泛型,则工作正常:

Map<String,Map<String,Integer>> map = new HashMap<String,Map<String,Integer>>();
map.put("Test", new HashMap<String,Integer>());
map.get("Test").put("Some", 1);