首页 > 解决方案 > 循环自列表

问题描述

我有这个 Person 类,它有一个 Person (s) 列表。如何遍历人员并检查其中的每个对象是否有一个 Person(s) 列表以及其中的每个对象是否有一个列表等等?就嵌套的方式而言,我能想到的一切都非常有限。我可以编写一个递归循环,但这让我深入到第一级,但不确定如何通过递归获得 x 级深度。我确信过去有人遇到过这个问题,这应该不是那么困难,但我就是不能完全理解它。欢迎任何和所有想法!

public class Person {
    // other fields removed for simplicity
    private long id;
    private List<Person> persons;

    public List<Person> getPersons() {
        return debates;
    }
}

// essentially I am looking for a way to make this unlimited level nested looping
private void loopPersons() {
    Person person = new Person();

    if(person.getPersons() != null && !person.getPersons().isEmpty()) {
        for(Person person1 : person.getPersons()) {
            if(person1.getPersons() != null && !person1.getPersons().isEmpty()) {
                System.out.println(person1.getId());

                for(Person person2 : person1.getPersons()) {
                    if(person2.getPersons() != null && !person2.getPersons().isEmpty()) {
                        System.out.println(person2.getId());
                    }
                }
            }
        }
    }
}

更新:布赖恩在另一篇文章(向下滚动)中的回答基本上就是它的作用。遍历递归对象

标签: javaloopsrecursionarraylist

解决方案


您可能只是在寻找一些使用带有尾条件的递归的扁平化方法。这可能类似于以下实现

// essentially I am looking for a way to make this unlimited level nested looping
private List<Person> loopPersons(Person person, List<Person> flattened) {
    if (person.getPersons() == null || person.getPersons().isEmpty()) {
        return flattened;
    } else {
        flattened.addAll(person.getPersons());
        person.getPersons().forEach(p -> loopPersons(p, flattened));
    }
    return flattened;
}

注意:代码未经测试,旨在描述一种可能的方法,如果您考虑相同的思路,您可以采取这种方法。


推荐阅读