我有以下HashMap
map
,其中包含ArrayList
content
,其中包含多个HashMaps
:
{
key1=val1,
key2=val2,
// ...
content= [
{
keyAbc=val10,
keyDef=val11,
KeyGhi=val12,
},
{
keyAbc=val13,
keyDef=val14,
KeyGhi=val15
},
{
keyAbc=val16,
keyDef=val17,
KeyGhi=val18
}
],
key20=val20,
// ...
}
现在我需要获取所有键和值content
。
当我尝试
for(int i=0; i<map.get("content").size(); i++){}
它说cannot find symbol
,好像它无法识别ArrayList
。
但是,将其强制转换为ArrayList是可行的:
for(int i=0; i<((ArrayList)map.get("content")).size(); i++){}
因此在该循环中,我尝试:
// for(...){
for(Map.Entry<Object, Object> obj : (((ArrayList)map.get("content")).get(i)){}
}
出现以下错误:
for-each不适用于表达式类型
必需:数组或java.lang.Iterable
找到:对象
铸造为HashMap:
// for(...){
for(Map.Entry<Object, Object> obj : ((HashMap)(ArrayList)map.get("content")).get(i)){}
}
产生该错误:
不兼容的类型:ArrayList无法转换为HashMap
那我该如何访问content
的内容?
答案 0 :(得分:2)
您要遍历Map
的条目,因此应调用entrySet
:
for (Map.Entry<Object, Object> obj : ((HashMap)((ArrayList)map.get("content")).get(i)).entrySet() {}
为了使其更具可读性,我将其分成多个语句。我也将使用接口类型代替ArrayList
和HashMap
。
List list = (List) map.get("content");
for (int i = 0; i < list.size(); i++) {
Map map = (Map) list.get(i);
for (Map.Entry<Object,Object> entry : map.entrySet()) {
}
}
答案 1 :(得分:1)
我将使用更多代码来使版本更具可读性,并用接口替换具体的类(您无法确定反序列化器将创建ArrayList
而不是另一种{{1 }},与List
)相同,具有以下代码:
Map
答案 2 :(得分:0)
您必须遍历作为值内容键的列表。我想下面的代码就是您想要的。
for (Map<Object, Object> listEntry : (List<Map<Object, Object>>) map.get("content")) {
for (Map.Entry innerMapEtry : listEntry.entrySet()) {
final Object key = innerMapEtry.getKey();
final Object value = innerMapEtry.getValue();
}
}