java构建树形结构

实体

@Data
public class SysCategoryTree {
    private static final long serialVersionUID = 1L;

    private String id;

    /** 父级节点 */
    private String pid;

    /** 类型名称 */
    private String name;

    /** 类型编码 */
    private String code;


    @TableField(exist = false)
    private List<SysCategoryTree> nodes;

    public SysCategoryTree() {
        // 默认使用哈希表
        nodes = new ArrayList<>();
    }
}

构建树形结构

  public static List<SysCategoryTree> buildSysCategoryTree(List<SysCategoryTree> node) {
        List<SysCategoryTree> res = new ArrayList<>();
        Map<String, SysCategoryTree> map = new HashMap<>();
        node.forEach(n -> map.put(n.getId(), n));
        node.forEach(n -> {
            //表示不是根目录
            if (n.getPid() != null) {
                if (n.getPid().equals("0")) {
                    res.add(n);
                } else {
                    //get当前父级节点
                    SysCategoryTree tree = map.get(n.getPid());
                    //根据父节点未查询到上级,代表错误数据,删除
                    if (tree != null) {
                        //将当前对象添加到当前父级节点的子级节点属性中
                        tree.getNodes().add(n);
                    }
                }
            }
        });
        return res;
    }

根据节点id获取该节点下所有数据

public List<SysCategoryTree> getNodeTree(List<SysCategoryTree> resList,String pid){
		List<SysCategoryTree> sysCategoryTree = new ArrayList<>();
		for (int i = 0; i < resList.size(); i++) {
			String id = resList.get(i).getId();
			List<SysCategoryTree> nodes = resList.get(i).getNodes();
			if(id.equals(pid)){
				sysCategoryTree.add(resList.get(i));
			}
		}
		if(CollectionUtils.isEmpty(sysCategoryTree)){
			for (SysCategoryTree sysCategoryTree1:resList){
				if(CollectionUtils.isNotEmpty(sysCategoryTree1.getNodes())){
						if(CollectionUtils.isNotEmpty(getNodeTree(sysCategoryTree1.getNodes(),pid))){
							return getNodeTree(sysCategoryTree1.getNodes(),pid);
						}else{
							getNodeTree(sysCategoryTree1.getNodes(),pid);
						}
				}
			}
		}

		return sysCategoryTree;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值