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

    1. 本周学习总结 1.1 以你喜欢式(思维导图或其他)归纳总结多数据库相关内容. 1.数据库的定义:是为了实现一定目的按某种规则组织起来的"数据"的"集合". ...

  2. 201521123095 《Java程序设计》第11周学习总结

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

  3. 201521123019 《Java程序设计》第9周学习总结

    1. 本章学习总结 2. 书面作业 一.题目5-1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:经常会出现Ar ...

  4. 201521123092《java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  5. Redis总结(六)Redis配置文件全解

    前面已经写了一些关于redis 的介绍,redis 的基本功能和用法,基本上都说了,有问题的可以去看看 http://www.cnblogs.com/zhangweizhong/category/77 ...

  6. JDBC操作数据库之查询数据

    以数据库中查找图书信息,并将信息显示在jsp页面当中为例,下面贴上代码片段: (1)在index.jsp页面代码body中只要添加如下一段代码: <a href="FindServle ...

  7. .NET Core 使用RabbitMQ

    RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...

  8. gephi安装后无法打开

    具体解决的方法是找到gephi.conf文件(在“gephi安装目录\etc”中)文件,添加下面的一行,指定jdkhome的路径. jdkhome="C:\Program Files (x8 ...

  9. Unitty 3D 贪吃蛇 今日小记 -- 碰撞

    当蛇头碰撞到蛋的时候  应该让蛋消失并且重新创建蛋. void OnTriggerEnter    可以使用这个方法 下面附有这个方法的介绍 其次需要对挂载在之上的Object  check IsTr ...

  10. 如何快速成长?我的java之路!

    由于一些外部的原因,我不得不从自己熟悉的php领域,转战到java战场.我个人觉得还是有些心得吧,不管怎么样,或多或少可能都会有那么些经历的人,和你一起走在这世上!尽管你不知道TA是谁. 其实,转换一 ...