迭代嵌套的地图和列表结构

时间:2019-01-21 14:14:36

标签: java arraylist hashmap

我有以下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


  1. 进入ArrayList

当我尝试

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++){}

  1. 进入HashMap

因此在该循环中,我尝试:

// 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的内容?

3 个答案:

答案 0 :(得分:2)

您要遍历Map的条目,因此应调用entrySet

for (Map.Entry<Object, Object> obj : ((HashMap)((ArrayList)map.get("content")).get(i)).entrySet() {}

为了使其更具可读性,我将其分成多个语句。我也将使用接口类型代替ArrayListHashMap

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();
        }
    }