猿问

递归检索列表中的所有元素

我有一个这样定义的“工作”类:


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;

    }

在主类中,我实例化并填充了 so 作业来测试它,但我得到了一个 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);

我知道为什么会出现异常,但我无法编辑该方法以使其返回所有孩子。


这个想法是检查所有的工作,看看他们是否也有自己的工作。如果他们这样做了,我会更深入地检索所有这些孩子,我会一直这样做,直到我检索到所有工作。


你能告诉我我在那个方法中做错了什么吗?


森林海
浏览 141回答 2
2回答

MM们

NullPointerException因为您在 for 循环开始后对列表进行空检查children。应该在进入循环之前完成。另外,我注意到您没有汇总结果,每次调用getJobChildren()您都会实例化一个新列表,并且您没有在方法返回时将其添加到父调用中。用于遍历子列表(假设没有循环)的深度优先递归算法可以如下:public List<Job> getJobChildren(final Job job, final List<Job> result) {&nbsp; &nbsp; if (job == null) {&nbsp; &nbsp; &nbsp; &nbsp; return result;&nbsp; &nbsp; }&nbsp; &nbsp; result.add(job);&nbsp; &nbsp; if(job.getChildren() != null){&nbsp; &nbsp; &nbsp; &nbsp; for(Job current : job.getChildren()){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getJobChildren(current, result);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return result;}您需要使用新的 ArrayList 触发第一次调用以收集结果。List<Job> results = new ArrayList<>();getJobChildren(parentJob, results);// Use the results here.

白板的微信

您需要检查空值:&nbsp; &nbsp; if (job.getChildren() != null) {&nbsp; &nbsp; &nbsp; &nbsp; for (Job k : children) {job.getChildren() 可以为空。无需迭代空列表。修正方法:public static List<Job> getJobChildren(Job job) {&nbsp; &nbsp; List<Job> result = new ArrayList<Job>();&nbsp; &nbsp; if (job == null) {&nbsp; &nbsp; &nbsp; &nbsp; return new ArrayList<Job>();&nbsp; &nbsp; }&nbsp; &nbsp; List<Job> children = job.getChildren();&nbsp; &nbsp; if (job.getChildren() != null) {&nbsp; &nbsp; &nbsp; &nbsp; for (Job k : children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (children != null && !children.isEmpty()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.addAll(children);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getJobChildren(k);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.add(k);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return result;}
随时随地看视频慕课网APP

相关分类

Java
我要回答