java实现递归组装树结构的数据

简介: java语言递归组装数据

开发中,经常遇到存在树形结构的数据,如行政区划这类数据,一级一级分层,后端需要组装好树形结构数据返回给前端。

由于返给前端的json数据中,如果是叶子节点了,说明它没有子节点,那么就没必要返回chirldren 属性给前端了,此时只需要加一个注解即可:@JsonInclude(JsonInclude.Include.NON_EMPTY),该注解会自动判断集合是否为空,为空的话就不返回给前端展示了。如果是String类型的属性的话,就使用@JsonInclude(JsonInclude.Include.NON_NULL)注解

实体类:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * <p>
 * 区域表
 * </p>
 *
 * @author sgw
 * @since 2023年09月06日
 */
@Data
@Accessors(chain = true)
@TableName("HJBZ_QY")
public class HjbzQy implements Serializable {
   

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId(value = "ID", type = IdType.AUTO)
    private String id;

    /**
     * 区域名称 0表示顶级区域
     */
    @TableField("QYMC")
    private String qymc;

    /**
     * 区域编码 0表示顶级区域
     */
    @TableField("QYBM")
    private String qybm;

    /**
     * 父级区域名称
     */
    @TableField("PARENT_QYMC")
    private String parentQymc;

    /**
     * 父级ID
     */
    @TableField("PID")
    private String pid;

    /**
     * 封装树结构数据
     * exist设置该属性为 false,表示在查询中不使用该字段
     *  @JsonInclude(JsonInclude.Include.NON_EMPTY): 为空时就不返回给前端了(说明是叶子节点了,没必要返给前端一个空集合)
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @TableField(exist = false)
    List<HjbzQy> chirldren = new ArrayList<>();
}
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ts.hjbz.entity.HjbzQy;
import com.ts.hjbz.dao.HjbzQyMapper;
import com.ts.hjbz.service.HjbzQyService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 区域表 服务实现类
 * </p>
 *
 * @author sgw
 * @since 2023年09月06日
 */
@Service
public class HjbzQyServiceImpl extends ServiceImpl<HjbzQyMapper, HjbzQy> implements HjbzQyService {
   
    @Autowired
    private  HjbzQyMapper hjbzQyMapper;

    @Override
    public List<HjbzQy> getDetailTree() {
   
        QueryWrapper<HjbzQy> wrapper = new QueryWrapper<>();
        List<HjbzQy> hjbzQyList= hjbzQyMapper.selectList(wrapper);

        //顶级节点的pid是0
        List<HjbzQy> tree = createTree(hjbzQyList, "0");
        return tree;
    }

    /**
     * 递归建立树形结构 (算法)
     * @param lists
     * @param pid
     * @return
     */
    private List<HjbzQy> createTree(List<HjbzQy> lists, String pid) {
   
        List<HjbzQy> tree = new ArrayList<>();
        for (HjbzQy qy : lists) {
   
            if (qy.getPid() .equals(pid) ) {
   
                qy.setChirldren(createTree(lists,qy.getId()));
                tree.add(qy);
            }
        }
        return tree;
    }
}
相关文章
|
23天前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
20 1
|
1月前
|
存储 算法 Java
Java中的集合框架:高效管理数据的关键
Java中的集合框架:高效管理数据的关键
16 0
|
1月前
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
267 1
|
30天前
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
27 4
|
23天前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
26天前
|
缓存 NoSQL Java
java中复杂业务情况下的集合操作(增减集合同步数据)
java中复杂业务情况下的集合操作(增减集合同步数据)
26 0
|
1月前
|
算法 Java
Java必刷入门递归题×5(内附详细递归解析图)
Java必刷入门递归题×5(内附详细递归解析图)
20 1
|
1月前
|
网络协议 Java
Java——UDP数据报
Java——UDP数据报
12 0
C4.
|
1月前
|
机器学习/深度学习 存储 搜索推荐
Java的递归
Java的递归
C4.
7 0
|
1月前
|
SQL Java easyexcel
【Java】百万数据excel导出功能如何实现
【Java】百万数据excel导出功能如何实现
110 0