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

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

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

先看效果:

数据库中的数据:

拼装后的效果:

  1. [
  2. EmpVO{
  3. ename='孙老三1',
  4. empno=10,
  5. mgr=0,
  6. subordinates=[
  7. EmpVO{
  8. ename='KING',
  9. empno=7839,
  10. mgr=10,
  11. subordinates=[
  12. EmpVO{
  13. ename='JONES',
  14. empno=7566,
  15. mgr=7839,
  16. subordinates=[
  17. EmpVO{
  18. ename='SCOTT',
  19. empno=7788,
  20. mgr=7566,
  21. subordinates=[
  22. EmpVO{
  23. ename='ADAMS',
  24. empno=7876,
  25. mgr=7788,
  26. subordinates=null
  27. }
  28. ]
  29. },
  30. EmpVO{
  31. ename='FORD',
  32. empno=7902,
  33. mgr=7566,
  34. subordinates=[
  35. EmpVO{
  36. ename='SMITH',
  37. empno=7369,
  38. mgr=7902,
  39. subordinates=null
  40. }
  41. ]
  42. }
  43. ]
  44. },
  45. EmpVO{
  46. ename='BLAKE',
  47. empno=7698,
  48. mgr=7839,
  49. subordinates=[
  50. EmpVO{
  51. ename='ALLEN',
  52. empno=7499,
  53. mgr=7698,
  54. subordinates=null
  55. },
  56. EmpVO{
  57. ename='WARD',
  58. empno=7521,
  59. mgr=7698,
  60. subordinates=null
  61. },
  62. EmpVO{
  63. ename='MARTIN',
  64. empno=7654,
  65. mgr=7698,
  66. subordinates=null
  67. },
  68. EmpVO{
  69. ename='TURNER',
  70. empno=7844,
  71. mgr=7698,
  72. subordinates=null
  73. },
  74. EmpVO{
  75. ename='JAMES',
  76. empno=7900,
  77. mgr=7698,
  78. subordinates=null
  79. }
  80. ]
  81. },
  82. EmpVO{
  83. ename='CLARK',
  84. empno=7782,
  85. mgr=7839,
  86. subordinates=[
  87. EmpVO{
  88. ename='MILLER',
  89. empno=7934,
  90. mgr=7782,
  91. subordinates=null
  92. }
  93. ]
  94. }
  95. ]
  96. }
  97. ]
  98. },
  99. EmpVO{
  100. ename='陈老五1',
  101. empno=20,
  102. mgr=0,
  103. subordinates=[
  104. EmpVO{
  105. ename='1',
  106. empno=200,
  107. mgr=20,
  108. subordinates=[
  109. EmpVO{
  110. ename='钱老二',
  111. empno=2000,
  112. mgr=200,
  113. subordinates=null
  114. }
  115. ]
  116. }
  117. ]
  118. },
  119. EmpVO{
  120. ename='zas1',
  121. empno=30,
  122. mgr=0,
  123. subordinates=[
  124. EmpVO{
  125. ename='陈生',
  126. empno=300,
  127. mgr=30,
  128. subordinates=[
  129. EmpVO{
  130. ename='李四',
  131. empno=3000,
  132. mgr=300,
  133. subordinates=null
  134. }
  135. ]
  136. }
  137. ]
  138. }
  139. ]

上代码:

  1. public class RecursiveDemo {
  2.  
  3. EmpService service = new EmpService();
  4.  
  5. public static void main(String[] args) throws SQLException, ClassNotFoundException {
  6.  
  7. EmpVO emp = new EmpVO();
  8. RecursiveDemo rd = new RecursiveDemo();
  9. List<EmpVO> l = rd.recursive21(0);
  10. System.out.println(l);
  11. }
  12.  
  13. List<EmpVO> recursive21(int mgr) throws SQLException, ClassNotFoundException {
  14. List<EmpVO> l = null;
  15. List<EmpVO> subordinates = service.getEmpsByMgr(mgr);
  16. if (subordinates != null && subordinates.size() > 0) {
  17. l = new ArrayList<EmpVO>();
  18. List<EmpVO> list = null;
  19. for (EmpVO empvo : subordinates) {
  20. list = recursive21(empvo.getEmpno());
  21. empvo.setSubordinates(list);
  22. l.add(empvo);
  23. }
  24. }
  25. return l;
  26. }
  27.  
  28. }

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

我先后尝试了  : 参数是 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. 201521123010 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  2. 201521123026《JAVA程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  3. 201521123070 《JAVA程序设计》第12周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  4. hadoop超租约报错:

    解决方法:修改linux打开文件最大限制Java代码 echo "fs.file-max = 65535" >> /etc/sysctl.conf echo " ...

  5. Linux 更改ssh 端口

    部署了一个测试服务器之后,在查看linux日志的时候,发现莫名的IP一直在访问服务器,感觉像是某种恶意扫描,来攻击服务器的.因此更改ssh端口. 输入: vim /etc/ssh/sshd_confi ...

  6. 系统学习java高并发系列二

    转载请注明原创出处,谢谢! 什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程 ...

  7. FoxOne---一个快速高效的BS框架--生成增删改查

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  8. 支持向量机SVM(Support Vector Machine)

    支持向量机(Support Vector Machine)是一种监督式的机器学习方法(supervised machine learning),一般用于二类问题(binary classificati ...

  9. JDFS:一款分布式文件管理系统,第三篇(流式云存储)

    一 前言 看了一下,距离上一篇博客的发表已经过去了4个月,时间过得好快啊.本篇博客是JDFS系列的第三篇博客,JDFS的目的是为了实现一个分布式的文件管理系统,前两篇实现了基本的上传.下载功能,但是那 ...

  10. Java中的HTTP通信技术详解

     1.使用HTTP的Get方式读取网络数据       class ReadByGet extends Thread{ @Override public void run(){ URL url = n ...