1、controller中的方法
/**
* 获取区域树
* @return
*/
@ResponseBody
@RequestMapping("/getAreaInfoTree")
public List<AreaInfo> getAreaInfoTree(){
List<AreaInfo> result = new ArrayList<AreaInfo>();
try {
//该区域list是pid,children为空
List<AreaInfo> list = areaInfoService.getAreaInfoList();
//遍历list,获取根节点为空的节点
for(AreaInfo areaInfo : list){
if(areaInfo.getParentCode() == null){
result.add(areaInfo);
}
}
//通过递归方法设置children信息
for(AreaInfo areaInfo : result){
setChildren(list, areaInfo);
}
return result;
} catch (Exception e) {
log.error("获取运营商应缴电费信息异常",e);
}
return null;
}
/**
* 使用递归方法设置节点的children信息
* @param list
* @param areaInfo
*/
private void setChildren(List<AreaInfo> list, AreaInfo areaInfo) {
Set<AreaInfo> children = new HashSet<AreaInfo>();
for(AreaInfo temp : list){
//遍历list,将该节点的父节点添加到children集合中
if(areaInfo.getAreaCode() != null && areaInfo.getAreaCode().equals(temp.getParentCode())){
//递归
setChildren(list,temp);
children.add(temp);
}
}
//设置children信息
areaInfo.setChildren(children);
}
上面的方法在三级节点时没有问题,但在有四级节点时,四级节点没有加载出来,所以调整后的代码如下:
private void setChildren(List<AreaInfoBean> list, AreaInfoBean areaInfo) {
//获取areaInfo节点的所有子节点
Set<AreaInfoBean> children = getChildren(list, areaInfo.getId());
//设置areaInfo的children
areaInfo.setChildren(children);
//遍历areaInfo的所有子节点
for(AreaInfoBean temp : children){
//递归设置areaInfo的子节点的children
setChildren(list,temp);
}
}
//根据节点id获取节点的所有子节点集合
private Set<AreaInfoBean> getChildren(List<AreaInfoBean> list,int id){
//空的子节点集合children
Set<AreaInfoBean> children = new HashSet<AreaInfoBean>();
for(AreaInfoBean temp : list){
//如果temp的pid不为空,且等于id,添加到children
if(temp.getPid() != null && temp.getPid() == id){
children.add(temp);
}
}
return children;
}
2、service看的方法
service接口
/**
* 获取区域信息列表
* @return
*/
public List<AreaInfo> getAreaInfoList();
service实现类:
/**
* 获取区域信息列表
* @return
*/
public List<AreaInfo> getAreaInfoList() {
try {
String hql = " from AreaInfo order where sign = 1 by areaCode ";
return baseDao.query(hql);
} catch (Exception e) {
return null;
}
}
数据库表数据如下:
转换为json如下图:
3、总结:
数据库中区域信息的通过pid来维护父子节点的,但前台页面是通过children来维护父子节点的。该递归方法主要实现了将list中的pid转换为children。
4、之前的一篇递归相关的文章Java递归示例:实现文档树
怎样写好和使用好递归,没有好的方法,多写,多读别人的递归示例,在多写的同时多想,边写边理解。