如何在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
我更喜欢创建一个扩展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);