【问题标题】:Loop Through Self List循环自列表
【发布时间】:2020-07-09 06:23:22
【问题描述】:

我有这个 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());
                    }
                }
            }
        }
    }
}

更新: Brian 在另一篇文章(向下滚动)中的回答基本上就是它的作用。 iterate through recursive objects

【问题讨论】:

  • 如果您可以将 loopPerson 作为 Person 的成员,您可以执行循环 x 级别。想想吧。
  • @AnkurJyotiPhukan 我没有关注;能详细点吗?

标签: java loops recursion arraylist


【解决方案1】:

您可能只是想在使用带有尾条件的递归方面进行一些扁平化处理。这可能类似于以下实现

// 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;
}

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

【讨论】:

  • flattened 参数作为 Set 可以更好地删除可能的重复项。它还应该包括检查一个人是否已经被检查以消除与无限递归相关的堆栈溢出的可能性。以防万一一个人是自己孩子的孩子。
  • @BeWu 是的,这就是我引用“相似”的原因,代码没有经过测试,而是描述了 OP 可以采取的可能方法。但是,是的,我也应该把它作为一个注释放在答案中。
【解决方案2】:

按如下方式进行:

import java.util.List;

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

    public Person(long id, List<Person> persons) {
        this.id = id;
        this.persons = persons;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }

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

    @Override
    public String toString() {
        return "Person [id=" + id + ", persons=" + persons + "]";
    }

    public void showAll() {
        if (getPersons() == null || getPersons().isEmpty()) {
            return;
        }
        getPersons().get(0).showAll();
        System.out.println(getPersons());
    }
}

演示:

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person(1,List.of(new Person(11, List.of(new Person(111, List.of(new Person(1111, null))),
                                                                new Person(112, List.of(new Person(1121, null))),
                                                                new Person(113, List.of(new Person(1131, null))))),
                                        new Person(12, List.of(new Person(121, List.of(new Person(1211, null))))),
                                        new Person(13, List.of(new Person(131, List.of(new Person(1311, null)))))));
        p1.showAll();
    }
}

输出:

[Person [id=1111, persons=null]]
[Person [id=111, persons=[Person [id=1111, persons=null]]], Person [id=112, persons=[Person [id=1121, persons=null]]], Person [id=113, persons=[Person [id=1131, persons=null]]]]
[Person [id=11, persons=[Person [id=111, persons=[Person [id=1111, persons=null]]], Person [id=112, persons=[Person [id=1121, persons=null]]], Person [id=113, persons=[Person [id=1131, persons=null]]]]], Person [id=12, persons=[Person [id=121, persons=[Person [id=1211, persons=null]]]]], Person [id=13, persons=[Person [id=131, persons=[Person [id=1311, persons=null]]]]]]

【讨论】:

  • 如果任何人有多个孩子,您的代码可能无法打印所有人。如果父级是其子级之一的子级,您的代码还将运行无限次,从而产生堆栈溢出。
  • 如果任何人有多个孩子,您将因此失败。 - 不@BeWu,这不是真的。我已经用更多孩子更新了示例人物。
  • @BeWu - id为1的人有三个孩子,id为11的人也有三个孩子。如果您查看输出,它们都会被打印出来。你还期待什么?
  • 对不起,我误读了输出。但是你仍然可以产生一个 stackoverflow。
  • @BeWu - 从逻辑上讲,父母不应该是其孩子之一的孩子,您的代码应该确保它不会发生。不过,你能告诉我一个我的代码会产生 StackOverflow 的例子吗?
猜你喜欢
  • 2012-12-04
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2012-08-05
  • 1970-01-01
  • 2013-03-10
  • 2011-08-03
相关资源
最近更新 更多