java递归实现遍历地理树

首先附上对象,getset就用lombok自行解决

/**
     * pid
     */
    private  Integer areaParentId;
    /**
     * 地理位置名称
     */
    private String areaName;
    /**
     * 排序
     */
    private Integer areaOrder;
        /**
     * 子菜单
     */
    private List<ZhafArea> children;


    @MyLog("查询查询地理数数据")
    @ApiOperation(value = "查询地理数数据", tags = "查询地理数数据")
    @GetMapping(value = "getArea")
    public R getArea(ZhafArea zhafArea) {
        R r = new R();
        Map<String,Object> data = new HashMap<String,Object>();
        //查询出所有的数据
        List<ZhafArea> Area = treeServic.findZhafArea();
        //根节点
        List<ZhafArea> rootMenu = new ArrayList<ZhafArea>();
        for (ZhafArea nav : Area) {
            if(nav.getAreaParentId()==0){//父节点是0的,为根节点。
                rootMenu.add(nav);
            }
        }
             /* 根据Menu类的order排序 */
        Collections.sort(Area, order());
        //为根菜单设置子菜单,getClild是递归调用的
        for (ZhafArea nav : rootMenu) {
        /* 获取根节点下的所有子节点 使用getChild方法*/
            List<ZhafArea> childList = getChild(nav.getAreaId(),Area);
            nav.setChildren(childList);//给根节点设置子节点
        }
        r.put("data",rootMenu);
        return r;
    }
 /*
  * 排序,根据order来排序
  */
    public Comparator<ZhafArea> order(){
        Comparator<ZhafArea> comparator = new Comparator<ZhafArea>() {
            @Override
            public int compare(ZhafArea o1, ZhafArea o2) {
                if(o1.getAreaOrder() != o2.getAreaOrder()){
                    return o1.getAreaOrder() - o2.getAreaOrder();
                }
                return 0;
            }
        };
        return comparator;
    }
     /**
 * 获取子节点
 * @param id 父节点id
 * @param allMenu 所有菜单列表
 * @return 每个根节点下,所有子菜单列表
 */
public List<ZhafArea> getChild(Integer id,List<ZhafArea> allMenu){
    //子菜单
    List<ZhafArea> childList = new ArrayList<ZhafArea>();
    for (ZhafArea nav : allMenu) {
        // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
        //相等说明:为该根节点的子节点。
        if(nav.getAreaParentId()==id){
            childList.add(nav);
        }
    }
    //递归
    for (ZhafArea nav : childList) {
        nav.setChildren(getChild(nav.getAreaId(), allMenu));
    }
    Collections.sort(childList,order());//排序
    //如果节点下没有子节点,返回一个空List(递归退出)
    if(childList.size() == 0){
        return new ArrayList<ZhafArea>();
    }
    return childList;
}

下面我们展示一下测试结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_30667039/article/details/88715242
今日推荐