需求: 需要组装成对象多层嵌套式的 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文件;

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

不可以 : 遍历的缘故 .

Java 递归调用 recursive 给一个参数 返回一大堆的更多相关文章

  1. 慎用Java递归调用

    总结:慎用Java递归调用,测试时可以尝试该方法,否则尽量不要使用递归!递归过多调用时,最好改为for或者whlie来代替. 在java语言中,使用递归调用时,如果过多的调用容易造成java.lang ...

  2. java接口调用——webservice就是一个RPC而已

    很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...

  3. java——递归调用

    递归函数调用调用本身,并通过自己的相应参数,这个计算过程中进行层,直到满足某些条件,只要停止呼叫. 递归函数的特点 1.函数要直接或间接调用自身. 2.要有递归终止条件检查.即递归终止的条件被满足后. ...

  4. Java递归调用

    6.递归调用 方法的递归调用就是方法自身调用自身. 以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,导致栈内存溢出错误!所以递归必须要有结束条件. public class Recursion ...

  5. java递归调用 return的问题

    最近比较闲,写了个递归调用获取最大公约数,刚开始写错了,但一直不明白错在哪,错误代码如下: public class Demo { public static void main(String[] a ...

  6. java jsp调用shell(带参数)脚本并返回值

    test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...

  7. Java递归调用改成非递归

          在java语言中,使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出和程序执行过慢.这是一个潜在Bug和影响程序执行效率问题,需要谨慎使 ...

  8. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  9. 二项分布。计算binomial(100,50,0.25)将会产生的递归调用次数(算法第四版1.1.27)

    算法第四版35页问题1.1.27,估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数: public static double binomial(int n,int ...

随机推荐

  1. 201521123076 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  2. Hibernate第五篇【inverse、cascade属性详解】

    前言 上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系).本博文主要讲解Inverse属性.cascade属性.这两个属性对关联关系都有影响 Invers ...

  3. Java通过链表实现队列

    class LinkedQueue<T> { /** * 队列大小,由构造函数初始化 */ private int maxSize; /** * 队头 */ private Node fr ...

  4. Spring-hibernate-BaseDao

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  5. IDEA用maven创建springMVC项目和配置

    工具准备:IDEA2016.3 Java jdk 1.8 1.DEA创建项目 新建一个maven project,并且选择webapp原型.  然后点击next  这里的GroupId和Artifac ...

  6. MMORPG战斗系统随笔(一)

    前言 很久没有更新博客,中间迁移过一次博客,后来一直忙于项目的开发,忙的晚上回去没时间写博客,周日又要自我调整一下,所以空闲了很久没有继续写博客.最近终于慢慢放慢节奏,项目也快上线了,可以有空写一些个 ...

  7. hdu 4468 spy 极其精彩的一道kmp灵活运用题

    出的超级好的一道题.至于好在哪里,请思考题目: 题意抽象出来为给定一个字符串r,找出它的一个最短后缀s,使得这个r可以被 s的某前缀+s的某前缀+......+s的某前缀+s本身构造出来. 具体题目描 ...

  8. Divisors poj2992

    Divisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9940   Accepted: 2924 Descript ...

  9. Easyui后台管理角色权限控制

    最近需要做一个粗略的后台管理的权限,根据用户的等级来加载相应的菜单,控制到子菜单.使用的是Easyui这个框架. 1.我使用的mysql数据库.在这里我就建立四张表,角色表(tb_users),菜单表 ...

  10. 使用SQLite做本地数据缓存的思考

    前言 在一个分布式缓存遍地都是的环境下,还讲本地缓存,感觉有点out了啊!可能大家看到标题,就没有想继续看下去的欲望了吧.但是,本地缓存的重要性也是有的! 本地缓存相比分布式缓存确实是比较out和比较 ...