Как получить значения из многоуровневой HashMap, хранящейся в ArrayList? - PullRequest
1 голос
/ 03 апреля 2012

Название говорит все.

Пример кода:

ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();

HashMap<String, Object> parentHash = new HashMap<String, Object>();
HashMap<String, String> childHash = new HashMap<String, String>();

childHash.put("child_id", "id")
childHash.put("name", "first last");
childHash.put("sex", "man");

parentHash.put("parent_id", "id");
parentHash.put("name", "first last");
parentHash.put("sex", "woman");

parentHash.put("children", childHash);
data.add(parentHash);

Все выглядит хорошо, если я печатаю «данные» ArrayList на экране (пример):

[{parent_id=id, name=first last, sex=woman, children=[{
        child_id=id, name=first last, sex=man
    }]
}, {parent_id=id, name=first last, sex=woman, children=[{
        child_id=id, name=first last, sex=man
    }]
}];

Так что это HashMap в HashMap, а затем в ArrayList. Я знаю, как получить значение от родителя, но как получить значение от ребенка?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012
Map<String, String> childData= (Map<String, String>) parent.get("children");
String childId= childData.get("child_id");

Также обратите внимание, что с вашей текущей структурой вы можете добавить только одного ребенка к родителю:

parentHash.put("children", childHash);
parentHash.put("children", anotherChildHash); //overrides childHash
Map<String, String> childData = (Map<String, String>) parent.get("children");

В конце кода, приведенного выше, childData содержит еще одинChildHash, а childHash больше не сохраняется в parentHash.

3 голосов
/ 03 апреля 2012

Приведенный выше ответ действительно захочет, но вы должны проверить, что childHash имеет значение null.Тем не менее, вы рассматривали возможность определения своих собственных классов?Например,

public class Person {
    private int person_id;
    private String name;
    private String sex;

    // Handle zero to many children
    private ArrayList<Person> children = new ArrayList<Person>();

    // getters and setters follow.
}

Потом;

if ( parent.hasChildren() ) {
    String name = parent.getChildren().get(0).getName();
}
1 голос
/ 03 апреля 2012

Ответ от assylias правильный.Однако я хочу добавить, что вы могли бы немного продвинуть свой дизайн ОО, чтобы все это правильно инкапсулировать в классы.Таким образом, вы избежите написания трудного для понимания, сложного в обслуживании кода.

...