Итерация вложенной структуры карт и списков - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующее 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++){}

Получение в HashMap

Итак, в этом цикле я пытаюсь:

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

Появляется следующая ошибка:

для каждого неприменимо к типу выражения
обязательно: массив или java.lang.Iterable
найдено: объект

Приведение в виде HashMap:

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

Выдает эту ошибку:

несовместимые типы: ArrayList не может быть преобразован в HashMap


Так как я могу получить доступ к содержимому content?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Я буду использовать больше кода, чтобы иметь его более читабельную версию, и заменю конкретные классы интерфейсами (вы не можете быть уверены, что десериализатор создаст 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  
  }  
}
0 голосов
/ 21 января 2019

Вы должны перебрать список, который является ключом значения значения.Я полагаю, код ниже - это то, что вы ищете.

         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();
        }
    }
0 голосов
/ 21 января 2019

Вы хотите перебрать записи 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()) {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...