需求: 需要组装成对象多层嵌套式的 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文件;
再问一个问题: 这种递归调用 可以 使用 尾递归 优化么?
不可以 : 遍历的缘故 .