如何在Java中访问嵌套的HashMaps?

我在Java中有一个HashMap,其内容(你可能都知道)可以被访问

HashMap.get("keyname"); 

如果在另一个HashMap中有一个HashMap,即一个嵌套的HashMap,我将如何访问内容? 我可以这样做,内联:

 HashMap.get("keyname").get("nestedkeyname"); 

谢谢。

你可以像你想象的那样做。 但是你的HashMap必须是模板化的:

 Map> map = new HashMap>(); 

否则,在从第一个地图检索第二个Map后,您必须对Map进行强制转换。

 Map map = new HashMap(); ((Map)map.get( "keyname" )).get( "nestedkeyname" ); 

是。

看到:

 public static void main(String args[]) { HashMap> map = new HashMap>(); map.put("key", new HashMap()); map.get("key").put("key2", "val2"); System.out.println(map.get("key").get("key2")); } 

正如其他人所说,你可以这样做,但你应该用generics定义地图,如下所示:

 Map> map = new HashMap>(); 

但是,如果你只是盲目地运行以下内容:

 map.get("keyname").get("nestedkeyname"); 

只要keyname不在地图中,你的程序就会崩溃,你会得到一个空指针exception。 你真的应该添加以下检查:

 String valueFromMap = null; if(map.containsKey("keyname")){ valueFromMap = map.get("keyname").get("nestedkeyname"); } 

是的,如果您对外部hashmap使用正确的generics类型签名。

 HashMap> hm = new HashMap>(); // populate the map hm.get("keyname").get("nestedkeyname"); 

如果你不使用generics,你必须进行强制转换才能将从外部哈希映射中检索到的对象转换为HashMap (或至少是一个Map ),然后才能调用它的get()方法。 但你应该使用generics;-)

如果您计划构建具有可变深度的 HashMaps,请使用递归数据结构

以下是提供示例界面的实现:

 class NestedMap { private final HashMap child; private V value; public NestedMap() { child = new HashMap<>(); value = null; } public boolean hasChild(K k) { return this.child.containsKey(k); } public NestedMap getChild(K k) { return this.child.get(k); } public void makeChild(K k) { this.child.put(k, new NestedMap()); } public V getValue() { return value; } public void setValue(V v) { value = v; } } 

示例用法:

 class NestedMapIllustration { public static void main(String[] args) { NestedMap m = new NestedMap<>(); m.makeChild('f'); m.getChild('f').makeChild('o'); m.getChild('f').getChild('o').makeChild('o'); m.getChild('f').getChild('o').getChild('o').setValue("bar"); System.out.println( "nested element at 'f' -> 'o' -> 'o' is " + m.getChild('f').getChild('o').getChild('o').getValue()); } } 

我来到这个StackOverflow页面,寻找从objc中知道的ala valueForKeyPath 。 我还来了另一篇文章 – Java的“键值编码” ,但最终编写了我自己的。

我仍然在寻找比apache的beanutils库中的PropertyUtils.getProperty更好的解决方案。

用法

 Map json = ... public String getOptionalFirstName() { return MyCode.getString(json, "contact", "firstName"); } 

履行

 public static String getString(Object object, String key0, String key1) { if (key0 == null) { return null; } if (key1 == null) { return null; } if (object instanceof Map == false) { return null; } @SuppressWarnings("unchecked") Map map = (Map)object; Object object1 = map.get(key0); if (object1 instanceof Map == false) { return null; } @SuppressWarnings("unchecked") Map map1 = (Map)object1; Object valueObject = map1.get(key1); if (valueObject instanceof String == false) { return null; } return (String)valueObject; } 

我更喜欢创建一个扩展HashMap的自定义地图。 然后重写get()以添加额外的逻辑,以便在地图不包含您的密钥时。 它将创建嵌套映射的新实例,添加它,然后返回它。

 public class KMap extends HashMap { public KMap() { super(); } @Override public V get(Object key) { if (this.containsKey(key)) { return super.get(key); } else { Map value = new KMap(); super.put((K)key, (V)value); return (V)value; } } } 

现在您可以像这样使用它:

 Map>> nestedMap = new KMap>>(); Map map = (Map) nestedMap.get(1).get(2); Object obj= new Object(); map.put(someKey, obj);