ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-05-27 11:33:31  阅读:166  来源: 互联网

标签:areaInfo JAVA temp 递归 示例 list 节点 children


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递归示例:实现文档树
怎样写好和使用好递归,没有好的方法,多写,多读别人的递归示例,在多写的同时多想,边写边理解。

标签:areaInfo,JAVA,temp,递归,示例,list,节点,children
来源: https://www.cnblogs.com/cmcjkzd/p/14817188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有