Получение рекурсивно всех элементов в списке - PullRequest
0 голосов
/ 11 января 2019

У меня есть класс "Job", определенный следующим образом:

public class Job extends AbstractJob
{
    private String name;
    private String jobCount;
    private String status;
    private List<Job> children;


    public Job(String name, String jobCount, String status, List<Job> children) {
        this.name = name;
        this.jobCount = jobCount;
        this.status = status;
        this.children = children;
    }

    public String getName()
    {
        return name;
    }

    public String getJobCount()
    {
        return jobCount;
    }

    public String getStatus()
    {
        return status;
    }

    public List<Job> getChildren() {
        return children;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setJobCount(String jobCount) {
        this.jobCount = jobCount;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setChildren(List<Job> children) {
        this.children = children;
    }
}

Что я хотел бы сделать, так это уметь извлекать все элементы из списка заданий, включая их детей. Вот что я сделал до сих пор:

   public List<Job> getJobChildren(Job job) {

        List<Job> result = new ArrayList<Job>();
        if (job == null) {
            return new ArrayList<Job>();
        }
        List<Job> children = job.getChildren();
            for (Job k : children) {
                if (children != null && !children.isEmpty()) {
                    result.addAll(children);
                    getJobChildren(k);
                } else {
                    result.add(k);
                }
            }
            return result;
    }

В основном классе я создал и заполнил задания для его проверки, но получаю исключение nullpointerException:

Job job2 = new Job("JOB0002","0002","Finished",null);
Job job3 = new Job("JOB0003","0003","Error",jobSubList);
Job job4 = new Job("JOB0004","0004","En cours",null);
jobSubList.add(job4);
List<Job> jobList = new ArrayList<Job>();
jobList.add(job2);
jobList.add(job3);
Job job = new Job("JOB0001","0001","En Cours",jobList);

Я знаю, почему я получаю исключение, но я не могу отредактировать метод, чтобы он возвращал всех детей.

Идея состоит в том, чтобы пройти через все рабочие места и посмотреть, есть ли у них собственные рабочие места. Если они это сделают, я иду на уровень глубже и извлекаю всех этих детей, и я продолжаю делать это, пока не получу все задания.

Не могли бы вы сказать мне, что я делаю неправильно в этом методе?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

NullPointerException, потому что вы делаете нулевую проверку списка children после запуска цикла for. Это должно быть сделано до того, как войдет в цикл. Кроме того, я заметил, что вы не агрегируете результаты, при каждом вызове getJobChildren() вы создаете новый список и не добавляете его в родительский вызов, когда метод возвращается.

Рекурсивный алгоритм, основанный на глубине, для обхода списка детей (при условии отсутствия циклов) может быть следующим:

public List<Job> getJobChildren(final Job job, final List<Job> result) {
    if (job == null) {
        return result;
    }

    result.add(job);
    if(job.getChildren() != null){
        for(Job current : job.getChildren()){
            getJobChildren(current, result);
        }
    }

    return result;
}

Вам нужно будет инициировать первый вызов, используя новый ArrayList для сбора результатов.

List<Job> results = new ArrayList<>();
getJobChildren(parentJob, results);

// Use the results here.
0 голосов
/ 11 января 2019

Вам нужно проверить на ноль:

    if (job.getChildren() != null) {
        for (Job k : children) {

job.getChildren () может быть нулевым. Нет необходимости повторять нулевой список.

Исправленный метод:

public static List<Job> getJobChildren(Job job) {

    List<Job> result = new ArrayList<Job>();
    if (job == null) {
        return new ArrayList<Job>();
    }
    List<Job> children = job.getChildren();
    if (job.getChildren() != null) {
        for (Job k : children) {
            if (children != null && !children.isEmpty()) {
                result.addAll(children);
                getJobChildren(k);
            } else {
                result.add(k);
            }
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...