需求: 需要组装成对象多层嵌套式的 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. 201521123059 《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 参考资料: 百度脑图 XMind 1.2 使用常规方法总结其他上课内容. 1.多态性就是相同的形态,不同的行为(不同的定义).多态就 ...

  2. 201521123115 《Java程序设计》第4周学习总结

    1.本周学习总结 2.书面作业 1.注释的作用 2.面向对象设计 2.1将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事.(不得少于50字,参考QQ群中PPT的范例). 感觉自己在代码方 ...

  3. SSH复用代码最终版

    web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...

  4. python3中的编码与解码用法

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' #python3在编码时会把str编码成utf-8的bytes类型 ...

  5. Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)

    上一篇讲了如何在linux搭建web环境,这边将如何部署项目. 1,打包项目包 2,上传项目包 将.war项目包通过xftp上传到tomcat目录wabapps目录下 3,启动项目 通过xshell命 ...

  6. ②jquery复习

    # jQuery 复习--by 传智前端与移动开发学院 ## 1. jQuery是什么?(了解)+ www.github.com+ jQuery 其实就是一堆的js函数,是普通的js,只不过应用广泛, ...

  7. BZOJ1207_打鼹鼠_KEY

    [HNOI2004]打鼹鼠 Time Limit: 10 Sec Memory Limit: 162 MB Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地 ...

  8. java 线程一

    java基础学习总结--线程(一) 一.线程的基本概念 线程理解:线程是一个程序里面不同的执行路径 每一个分支都叫做一个线程,main()叫做主分支,也叫主线程. 程只是一个静态的概念,机器上的一个. ...

  9. PHP中isset和empty的区别(最后总结)

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  10. Linux学习——shell编程之正则表达式和字符处理命令

    shell编程之正则表达式 一 正则表达式 1 什么是正则表达式 正则表达式用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分隔.匹配.查找及替换操作. 2 shell编程之正则表达式 ...