树形结构递归算法实现

使用递归算法实现树形结构

- 小伙伴们在开发的过程中,前端会要求返回树形结构的数据(例如省市区),下面我们来介绍一下使用递归算法来解决这个问题

//实体类
@Data
@TableName("流域单元")
@ApiModel(value = "流域单元", description = "流域单元")
public class WaterCode implements Serializable {

    @TableField(value = "PID")
    @ApiModelProperty(value = "PID")
    private String PID;

    @TableField(value = "\"WRRCD\"")
    @ApiModelProperty(value = "\"WRRCD\"")
    private String WRRCD;

    @TableField(value = "\"NAME\"")
    @ApiModelProperty(value = "\"NAME\"")
    private String NAME;

    @TableField(value = "\"CENTER_X\"")
    @ApiModelProperty(value = "\"CENTER_X\"")
    private String CENTER_X;

    @TableField(value = "\"CENTER_Y\"")
    @ApiModelProperty(value = "\"CENTER_Y\"")
    private String CENTER_Y;

    @TableField(value = "\"LEVEL_\"")
    @ApiModelProperty(value = "\"LEVEL_\"")
    private String LEVEL_;
}
  • 我这里使用并且映射的是VO类,大家用不着这个类的话就用实体类
//Vo类
public class AreaMenuVo {
    private String PID;

    private String WRRCD;

    private String NAME;

    //子类
    private List<AreaMenuVo> children;
}
  • Mapper
 List<AreaMenuVo> one();
 
//mapper.xml
 
<select id="one" resultType="com.chuangshui.modules.area.vo.AreaMenuVo">
        select * from "流域单元"
</select>

大家可以看到,这里resultType映射的是VO类

  • ServiceImpl
	@Autowired
    private WaterCodeMapper waterCodeMapper;

    @Override
    public List<AreaMenuVo> one() {
	//如果用的是mybatis-plus插件,那么获取全部数据就用this.list();
        List<AreaMenuVo> areaMenuVos = waterCodeMapper.one();//显示全部数据
        List<AreaMenuVo> areaMenuVoFirst=new ArrayList<>();//用来存储一级菜单
        createMenu(areaMenuVos,areaMenuVoFirst,"0");
        return areaMenuVoFirst;//最终要返回一级菜单而不是全部数据
    }

    //使用递归算法
    private void createMenu(List<AreaMenuVo> areaMenuVoList,List<AreaMenuVo> rAreaMenuVo,String pid){
        for(AreaMenuVo areaMenuVo:areaMenuVoList){
            if(areaMenuVo.getPID().equals(pid)){
                List<AreaMenuVo> temp=new ArrayList<>();
                //这里的areaMenuVo.getWRRCD()就是字段id,id要和pid进行对应,二级菜单的pid就是一级菜单的id
                createMenu(areaMenuVoList,temp,areaMenuVo.getWRRCD()); 
                if(temp.size()>0){
                    areaMenuVo.setChildren(temp);
                }
                rAreaMenuVo.add(areaMenuVo);
            }
        }
    }
  • 到这里递归算法实现树形结构就结束了,然后在Controller中调用one()这个方法返回给前端就可以啦。
  • 此文章主要是记录一下解决的问题,方便日后的查看

你可能感兴趣的:(算法,java)