我有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行?
答案 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);