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文件;
再问一个问题: 这种递归调用 可以 使用 尾递归 优化么?
不可以 : 遍历的缘故 .
Java 递归调用 recursive 给一个参数 返回一大堆的更多相关文章
- 慎用Java递归调用
总结:慎用Java递归调用,测试时可以尝试该方法,否则尽量不要使用递归!递归过多调用时,最好改为for或者whlie来代替. 在java语言中,使用递归调用时,如果过多的调用容易造成java.lang ...
- java接口调用——webservice就是一个RPC而已
很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...
- java——递归调用
递归函数调用调用本身,并通过自己的相应参数,这个计算过程中进行层,直到满足某些条件,只要停止呼叫. 递归函数的特点 1.函数要直接或间接调用自身. 2.要有递归终止条件检查.即递归终止的条件被满足后. ...
- Java递归调用
6.递归调用 方法的递归调用就是方法自身调用自身. 以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,导致栈内存溢出错误!所以递归必须要有结束条件. public class Recursion ...
- java递归调用 return的问题
最近比较闲,写了个递归调用获取最大公约数,刚开始写错了,但一直不明白错在哪,错误代码如下: public class Demo { public static void main(String[] a ...
- java jsp调用shell(带参数)脚本并返回值
test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...
- Java递归调用改成非递归
在java语言中,使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出和程序执行过慢.这是一个潜在Bug和影响程序执行效率问题,需要谨慎使 ...
- 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用
5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...
- 二项分布。计算binomial(100,50,0.25)将会产生的递归调用次数(算法第四版1.1.27)
算法第四版35页问题1.1.27,估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数: public static double binomial(int n,int ...
随机推荐
- 201521123010 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123026《JAVA程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123070 《JAVA程序设计》第12周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- hadoop超租约报错:
解决方法:修改linux打开文件最大限制Java代码 echo "fs.file-max = 65535" >> /etc/sysctl.conf echo " ...
- Linux 更改ssh 端口
部署了一个测试服务器之后,在查看linux日志的时候,发现莫名的IP一直在访问服务器,感觉像是某种恶意扫描,来攻击服务器的.因此更改ssh端口. 输入: vim /etc/ssh/sshd_confi ...
- 系统学习java高并发系列二
转载请注明原创出处,谢谢! 什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程 ...
- FoxOne---一个快速高效的BS框架--生成增删改查
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
- 支持向量机SVM(Support Vector Machine)
支持向量机(Support Vector Machine)是一种监督式的机器学习方法(supervised machine learning),一般用于二类问题(binary classificati ...
- JDFS:一款分布式文件管理系统,第三篇(流式云存储)
一 前言 看了一下,距离上一篇博客的发表已经过去了4个月,时间过得好快啊.本篇博客是JDFS系列的第三篇博客,JDFS的目的是为了实现一个分布式的文件管理系统,前两篇实现了基本的上传.下载功能,但是那 ...
- Java中的HTTP通信技术详解
1.使用HTTP的Get方式读取网络数据 class ReadByGet extends Thread{ @Override public void run(){ URL url = n ...