L oop через личный список - PullRequest
4 голосов
/ 28 марта 2020

У меня есть этот класс Person, у которого есть список Person (ов). Как я могу * l oop через людей и проверить, есть ли у каждого объекта внутри него список людей, и есть ли у каждого объекта внутри него список, и так далее, и так далее? Все, что я могу придумать, довольно ограниченно, насколько оно вложено. Я могу написать рекурсивную l oop, но я получаю глубокий первый уровень, но не знаю, как получить 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());
                    }
                }
            }
        }
    }
}

ОБНОВЛЕНИЕ: Ответ Брайана в этом другом посте (прокрутить вниз), по сути, то, что он делает. перебрать рекурсивные объекты

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Возможно, вы просто ищете некоторое выравнивание на линиях использования рекурсии с условием хвоста. Это может быть похоже на следующую реализацию

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

Примечание : код не проверен и должен показать возможный подход, который вы можете использовать, если считаете, по тем же строкам.

0 голосов
/ 28 марта 2020

Сделайте это следующим образом:

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]]]]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...