【问题标题】:Iterating nested Structure of Maps and Lists迭代地图和列表的嵌套结构
【发布时间】:2019-01-21 14:14:35
【问题描述】:

我有以下HashMapmap,包含ArrayListcontent,包含几个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的内容呢?

【问题讨论】:

  • 您声明的类型有问题。除非您为对象使用适当的类,否则这些类型转换将是必要的。这是反序列化的 JSON 吗?
  • @ernest_k:是的。
  • @user1170330 你能发布json而不是json的jvm检查吗?

标签: java arraylist hashmap


【解决方案1】:

你想遍历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()) {

    }
}

【讨论】:

    【解决方案2】:

    我将使用更多代码来获得更易于阅读的版本,并用接口替换具体类(你不能确定反序列化器会创建一个ArrayList 而不是另一种List,同样对于Map) 具有以下代码:

    List content = (List) map.get("content");
    for (Object item : content) {
      Map itemMap = (Map) item;
      for (Map.Entry entry : itemMap.entrySet()) {
         // Doing what you like with entry  
      }  
    }
    

    【讨论】:

      【解决方案3】:

      您必须遍历作为值内容键的列表。我想下面的代码就是你要找的。​​p>

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

      【讨论】:

        猜你喜欢
        • 2013-03-16
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多