如何循环遍历这个嵌套数组并从每个项目创建一个模型? [Java]

问题描述 投票:0回答:2

假设这里的每个人都有 3 个键值对,姓名、年龄和孩子。我想迭代可能无限嵌套的列表,并为每个人创建一个新的“父”模型。我需要从每个人员模型中为每个嵌套级别创建一个人员模型列表,如果某个特定人员有孩子,则该人员模型上的孩子属性将包含正确孩子的后续列表。 (请注意,主要生成的人员嵌套列表存储在内存中的其他位置,我只需要帮助创建它们,就像在我的示例中一样)


Example Structure:

Persons
- Person
- Person
    - Person
- Person
    - Person
        - Person
        - Person

Each Person above has a name, age, and children property.

ex. 
{Persons: 
    [name: John, age: 18, children: null},
     {name: Lisa, age: 32, children: [{ name: Tyler, age: 7, children: null}],
     {name: Mike, age: 90, children: [{name: Derek, age 50, children: 
                                                 [{name: Mary, age:25, children: null},
                                                 {name: Beth, age:16, children: null}]}]};
     

递归不是我最擅长的领域,我在如何循环遍历可能非常深的嵌套对象方面遇到了很大的困难。我知道这是非常错误的,因为我只覆盖了第一层嵌套。我想我应该使用像我在底部写的那样的 createPerson 方法,并使用递归函数,但我很挣扎。非常感谢任何见解!

ListPerson API 返回 Persons[] 人

private void loadPersons(String id) {

    ListPersonsApi.Request request = Jso.create();
    request.id = id;

    dispatcher.send(ListPersonsApi.PATH, request, r-> {

        for (ListPersonsApi.persons p : r.persons) {

            List<Person> persons = new ArrayList<>();
            PersonModel person = new Person();
            person.name = p.name;
            person.age = p.age;
            persons.add(person);
            parent.children = persons;
            
            // Everything below this is wrong of course but its the logic I was thinking of using
            List<Person> children = p.children;
            while(children != null) {
               for (ListPersonsApi.persons q : p.children) {
                   createPerson(p, q)
                   children = children.children;
        }
    })
}

       
private void createPerson(PersonModel parent, p) {

        List<Person> persons = new ArrayList<>();
        PersonModel person = new Person();
        person.name = p.name;
        person.age = p.age;
        persons.add(person);
        parent.children = persons;
}
    
java loops class recursion nested
2个回答
1
投票

这是一个算法;我没有修改您的代码,因为我无法访问许多对象。

你是对的,你需要递归调用来完成此任务,尽管我确信还有其他措施可用。

让我们考虑以下内容,一个保存信息的类,称之为

Person

我还提供了一个重写的
toString
方法,因此我们可以打印信息。

static class Person {
    String name;
    int age;
    List<Person> children;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    Person(String name, int age, List<Person> children) {
        this.name = name;
        this.age = age;
        this.children = children;
    }

    @Override
    public String toString() {
        String string = "'%s', %d, ".formatted(name, age);
        if (children == null)
            return string + "no children";
        else {
            if (children.size() == 1) return string + "1 child";
            else return string + children.size() + " children";
        }
    }
}

从这里开始,我创建了一个类,称之为

Example
,它包含一个字段和一个方法。
该字段是
List
Person
,我们将用它来保存递归方法生成的数据。
该方法是一个递归函数,它将遍历给定的列表,并将人员添加到列表中。
随后,如果此人有孩子,通过进行递归调用并提供列表,他们也将被添加到列表中。

List<Person> persons = new ArrayList<>();

void persons(List<Person> list) {
    for (Person person : list) {
        persons.add(person);
        if (person.children != null) {
            persons(person.children);
        }
    }
}

在一个单独的方法中,我填充了一个列表,用于演示目的。
它相当于您提供的示例数据,具有相同的姓名、年龄和孩子。

如果我运行该课程并打印

persons
,我会得到以下数据。

'John', 18, no children
'Lisa', 32, 1 child
'Tyler', 7, no children
'Mike', 90, 1 child
'Derek', 50, 2 children
'Mary', 25, no children
'Beth', 16, no children

所以,如果我是正确的,考虑到这些过程,您可以将

loadPersons
方法更改为以下内容。

private void loadPersons(String id) {
    ListPersonsApi.Request request = Jso.create();
    request.id = id;
    List<Person> list = new ArrayList<>();
    dispatcher.send(ListPersonsApi.PATH, request, r -> {
        for (ListPersonsApi.persons p : r.persons)
            list.add(new Person(p.name, p.age, p.children));
    });
    persons(list);
}

0
投票

对于每个人,您都有给出的“孩子”信息。这隐含地使该人成为孩子的父母。查看您的数据,它是非常递归的,但如果您愿意,也可以通过迭代来解决。取决于您如何在内存中托管对象。

因此循环遍历所有人(有/没有递归)。与该人(名为 P)一起迭代所有子级(名为 C)。将孩子的父关系设置为P。

在程序的某些改进版本中,您可以在设置孩子的父母之前检查之前是否没有注册父母,或者如果设置了父母,则它应该与您要设置的父母没有什么不同。这样您就可以验证一些输入数据。

© www.soinside.com 2019 - 2024. All rights reserved.