我在Java中有一个HashMap,可以访问其中的内容(大家都知道)
HashMap.get("keyname");
Run Code Online (Sandbox Code Playgroud)
如果在另一个HashMap中有一个HashMap,即嵌套的HashMap,我将如何访问内容?我可以这样做,内联:
HashMap.get("keyname").get("nestedkeyname");
Run Code Online (Sandbox Code Playgroud)
谢谢.
tan*_*ens 63
你可以像你想象的那样做.但是你的HashMap必须是模板化的:
Map<String, Map<String, String>> map =
new HashMap<String, Map<String, String>>();
Run Code Online (Sandbox Code Playgroud)
否则,Map在从第一个地图检索第二个地图后,您必须进行强制转换.
Map map = new HashMap();
((Map)map.get( "keyname" )).get( "nestedkeyname" );
Run Code Online (Sandbox Code Playgroud)
是.
看到:
public static void main(String args[]) {
HashMap<String, HashMap<String, Object>> map = new HashMap<String, HashMap<String,Object>>();
map.put("key", new HashMap<String, Object>());
map.get("key").put("key2", "val2");
System.out.println(map.get("key").get("key2"));
}
Run Code Online (Sandbox Code Playgroud)
您可以通过重复获得嵌套值.get(),但是对于深度嵌套的映射,您必须进行大量的转换为Map. 一种更简单的方法是使用通用方法来获取嵌套值。
public static <T> T getNestedValue(Map map, String... keys) {
Object value = map;
for (String key : keys) {
value = ((Map) value).get(key);
}
return (T) value;
}
Run Code Online (Sandbox Code Playgroud)
// Map contents with string and even a list:
{
"data": {
"vehicles": {
"list": [
{
"registration": {
"owner": {
"id": "3643619"
}
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
List<Map> list = getNestedValue(mapContents, "data", "vehicles", "list");
Map first = list.get(0);
String id = getNestedValue(first, "registration", "owner", "id");
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,你可以这样做,但你应该用泛型定义地图,如下所示:
Map<String, Map<String, String>> map = new HashMap<String, Map<String,String>>();
Run Code Online (Sandbox Code Playgroud)
但是,如果你只是盲目地运行以下内容:
map.get("keyname").get("nestedkeyname");
Run Code Online (Sandbox Code Playgroud)
只要keyname不在地图中,你的程序就会崩溃,你会得到一个空指针异常.你真的应该添加以下检查:
String valueFromMap = null;
if(map.containsKey("keyname")){
valueFromMap = map.get("keyname").get("nestedkeyname");
}
Run Code Online (Sandbox Code Playgroud)
如果您计划构建具有可变深度的 HashMaps ,请使用递归数据结构.
以下是提供示例界面的实现:
class NestedMap<K, V> {
private final HashMap<K, NestedMap> child;
private V value;
public NestedMap() {
child = new HashMap<>();
value = null;
}
public boolean hasChild(K k) {
return this.child.containsKey(k);
}
public NestedMap<K, V> 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;
}
}
Run Code Online (Sandbox Code Playgroud)
和示例用法:
class NestedMapIllustration {
public static void main(String[] args) {
NestedMap<Character, String> 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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80250 次 |
| 最近记录: |