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 ...
随机推荐
- 201521123022 《Java程序设计》 第二周学习总结
1. 本章学习收获 (1)在老师指导下学会如何使用码云管理代码,代码不仅是保存到本地,还需要Push到码云这个"仓库"里. (2)JDK源代码可以为我们的编程提供许多便利之处,应善 ...
- 201521123017 《Java程序设计》第9周学习总结
1. 本周学习总结 2. 书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 1.3 什么样的 ...
- 201521123056 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- java第十二次作业
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123053《Java程序设计》第十周学习总结
---恢复内容开始--- 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 在java多线程程序中,所有线程都不允许抛出未捕获的checked excepti ...
- Spring详解(六)------AOP 注解
上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...
- JavaScript基础回顾
1, NaN 不是数字 Infinity 无穷大 alert(parseInt("dd")); //NaN alert(1/0); //Infinity 2, 逻辑或 || ,返 ...
- 国际化:Java平台下的Locale类
Locale类有如下几个构造器: Locale(String language) Locale(String language, String country) Locale(String langu ...
- Python: 列表注意细节与元组的基本用法
列表注意细节: 1.list.clear():将列表中成员清空(与del list区别开) 2.list.copy():复制一份相同的列表(浅COPY,只复制列表第一层) 3.如果两个列表相等,如li ...
- cocos2dx 中触摸事件分发一些解读
触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...