假设这里的每个人都有 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;
}
这是一个算法;我没有修改您的代码,因为我无法访问许多对象。
你是对的,你需要递归调用来完成此任务,尽管我确信还有其他措施可用。
让我们考虑以下内容,一个保存信息的类,称之为
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);
}
对于每个人,您都有给出的“孩子”信息。这隐含地使该人成为孩子的父母。查看您的数据,它是非常递归的,但如果您愿意,也可以通过迭代来解决。取决于您如何在内存中托管对象。
因此循环遍历所有人(有/没有递归)。与该人(名为 P)一起迭代所有子级(名为 C)。将孩子的父关系设置为P。
在程序的某些改进版本中,您可以在设置孩子的父母之前检查之前是否没有注册父母,或者如果设置了父母,则它应该与您要设置的父母没有什么不同。这样您就可以验证一些输入数据。