为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森林海 2022-04-28 16:00:55
我有一个这样定义的“工作”类: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);我知道为什么会出现异常,但我无法编辑该方法以使其返回所有孩子。这个想法是检查所有的工作,看看他们是否也有自己的工作。如果他们这样做了,我会更深入地检索所有这些孩子,我会一直这样做,直到我检索到所有工作。你能告诉我我在那个方法中做错了什么吗?
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

NullPointerException因为您在 for 循环开始后对列表进行空检查children。应该在进入循环之前完成。另外,我注意到您没有汇总结果,每次调用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.


查看完整回答
反对 回复 2022-04-28
?
白板的微信

TA贡献1883条经验 获得超3个赞

您需要检查空值:


    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;

}


查看完整回答
反对 回复 2022-04-28
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号