3

我有 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 行?

4

8 回答 8

15

使用泛型,您可以:

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

如果地图不是通用的:

Map map1 = ...
((Map)map1.get(category)).put(subcategory, value);
于 2009-09-01T15:32:39.517 回答
9
((Map)map1.get(subCategoryMap)).put(newKey, newValue);

或者,使用泛型:

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

...

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

但是,NullPointerException如果map1不包含subCategoryMap.

于 2009-09-01T15:31:46.587 回答
3

顺便说一句(我会对此发表评论,但我认为它会有点长)......

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

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

为了可读性,我会说泛型解决方案与我放在一行上的数量差不多——对于铸造解决方案,我将它分成两行;如果任何一个参数是操作而不是简单的变量,我也会将其分解为多行。

我知道很多人不会同意这一点,说实话,一开始我倾向于在一行上写很多,但我注意到,在出现问题或任何混乱的第一个迹象时,它让我的生活更容易将所有内容分解为具有明确命名变量的单独语句。

至少同样重要——在嵌套集合的情况下,我也经常将集合包装在不同的对象中。在你的情况下这会很有趣——电话会变得更清楚一点。

dataHolder.put(category, newKey, newVale);

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

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

于 2009-09-01T16:19:57.457 回答
0

如果您不使用泛型,则 HashMap 将键和值作为对象存储和检索,因此您可能需要强制转换,看起来像这样:

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

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

于 2009-09-01T15:31:49.550 回答
0

如果您使用 Generic 集合,那么您的代码应该按照编写的方式工作。否则,您需要在单行中添加适当的演员表。

于 2009-09-01T15:31:53.670 回答
0

只要map1声明类似Map<OuterKey, Map<InnerKey, MyValue>>,单行就可以工作。但是,您需要注意如果subCategoryMap不存在会发生什么map1- 单线将引发NullPointerException.

于 2009-09-01T15:32:19.487 回答
0

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

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

于 2009-09-01T15:33:11.123 回答
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);
于 2009-09-01T15:34:58.297 回答