Java 递归调用 recursive 给一个参数 返回一大堆

需求: 需要组装成对象多层嵌套式的 json字符串; 

想到使用 递归来完成这个多层嵌套: 

憋了四个小时,终于写出来了;

先看效果: 

数据库中的数据:

拼装后的效果:

[
    EmpVO{
        ename='孙老三1',
        empno=10,
        mgr=0,
        subordinates=[
            EmpVO{
                ename='KING',
                empno=7839,
                mgr=10,
                subordinates=[
                    EmpVO{
                        ename='JONES',
                        empno=7566,
                        mgr=7839,
                        subordinates=[
                            EmpVO{
                                ename='SCOTT',
                                empno=7788,
                                mgr=7566,
                                subordinates=[
                                    EmpVO{
                                        ename='ADAMS',
                                        empno=7876,
                                        mgr=7788,
                                        subordinates=null
                                    }
                                ]
                            },
                            EmpVO{
                                ename='FORD',
                                empno=7902,
                                mgr=7566,
                                subordinates=[
                                    EmpVO{
                                        ename='SMITH',
                                        empno=7369,
                                        mgr=7902,
                                        subordinates=null
                                    }
                                ]
                            }
                        ]
                    },
                    EmpVO{
                        ename='BLAKE',
                        empno=7698,
                        mgr=7839,
                        subordinates=[
                            EmpVO{
                                ename='ALLEN',
                                empno=7499,
                                mgr=7698,
                                subordinates=null
                            },
                            EmpVO{
                                ename='WARD',
                                empno=7521,
                                mgr=7698,
                                subordinates=null
                            },
                            EmpVO{
                                ename='MARTIN',
                                empno=7654,
                                mgr=7698,
                                subordinates=null
                            },
                            EmpVO{
                                ename='TURNER',
                                empno=7844,
                                mgr=7698,
                                subordinates=null
                            },
                            EmpVO{
                                ename='JAMES',
                                empno=7900,
                                mgr=7698,
                                subordinates=null
                            }
                        ]
                    },
                    EmpVO{
                        ename='CLARK',
                        empno=7782,
                        mgr=7839,
                        subordinates=[
                            EmpVO{
                                ename='MILLER',
                                empno=7934,
                                mgr=7782,
                                subordinates=null
                            }
                        ]
                    }
                ]
            }
        ]
    },
    EmpVO{
        ename='陈老五1',
        empno=20,
        mgr=0,
        subordinates=[
            EmpVO{
                ename='1',
                empno=200,
                mgr=20,
                subordinates=[
                    EmpVO{
                        ename='钱老二',
                        empno=2000,
                        mgr=200,
                        subordinates=null
                    }
                ]
            }
        ]
    },
    EmpVO{
        ename='zas1',
        empno=30,
        mgr=0,
        subordinates=[
            EmpVO{
                ename='陈生',
                empno=300,
                mgr=30,
                subordinates=[
                    EmpVO{
                        ename='李四',
                        empno=3000,
                        mgr=300,
                        subordinates=null
                    }
                ]
            }
        ]
    }
]

上代码: 

public class RecursiveDemo {

    EmpService service = new EmpService();

    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        EmpVO emp = new EmpVO();
        RecursiveDemo rd = new RecursiveDemo();
        List<EmpVO> l = rd.recursive21(0);
        System.out.println(l);
    }

    List<EmpVO> recursive21(int mgr) throws SQLException, ClassNotFoundException {
        List<EmpVO> l = null;
        List<EmpVO> subordinates = service.getEmpsByMgr(mgr);
        if (subordinates != null && subordinates.size() > 0) {
            l = new ArrayList<EmpVO>();
            List<EmpVO> list = null;
            for (EmpVO empvo : subordinates) {
                list = recursive21(empvo.getEmpno());
                empvo.setSubordinates(list);
                l.add(empvo);
            }
        }
        return l;
    }

}

 很有意思的是: 参数和返回结果:

我先后尝试了  : 参数是 emp  返回结果是 emp  ; 参数是 list 返回结果是 list  ;   参数是emp 返回结果是list ; 终于后来又尝试 参数 int  返回结果list ; 

从我对参数和返回结果的预设 可以看出: 

开始时 我的理解时:  最终的目标是返回一个对象 ;  所以 返回结果类型是 对象; 

又参考 dom4j 遍历 xml 文档 ; 觉得 返回应该是一个list ; 

对传入参数的理解 : 刚开始也是不对的 ; 认为可能是 list 或者 对象 ;

后来 又 参考 dom4j 遍历 xml 文档 : 觉得 参数可能不是一个直接的, 而是一个间接的 ;

综上所述: 

 递归 最常用的形式可能就是 :  给一个 返回一大堆 ; 

如: Java 递归遍历文件夹; 

如: dom4j递归遍历xml文件;

再问一个问题:  这种递归调用 可以 使用 尾递归 优化么?  

不可以 : 遍历的缘故 .

 

posted @ 2017-10-23 23:12  三目鸟  阅读(986)  评论(0编辑  收藏  举报