JAVA递归示例2:实现区域树

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;
    }
}

 

数据库表数据如下:
JAVA递归示例2:实现区域树

转换为json如下图:

JAVA递归示例2:实现区域树

3、总结:
数据库中区域信息的通过pid来维护父子节点的,但前台页面是通过children来维护父子节点的。该递归方法主要实现了将list中的pid转换为children。

4、之前的一篇递归相关的文章Java递归示例:实现文档树
怎样写好和使用好递归,没有好的方法,多写,多读别人的递归示例,在多写的同时多想,边写边理解。

上一篇:【.Net Core】分析.net core在linux下内存占用过高问题


下一篇:PHP中怎样创建一个空对象?