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;
}
下面我们展示一下测试结果