java 实现树形结构

实体父类

@Data
public class MenuTreeNode<T> {

    @ApiModelProperty(value = "节点ID")
    private String node;

    @ApiModelProperty(value = "父节点ID")
    private String parentNode;

    @ApiModelProperty(value = "子标签")
    private List<T> children;
}

实体子类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResourcePoolDetailVO extends MenuTreeNode<ResourcePoolDetailVO>  {

    @ApiModelProperty(value = "流程编号")
    private String targetId;

    @ApiModelProperty(value = "科目名称")
    private String projectName;

    @ApiModelProperty(value = "对比期数据")
    private BigDecimal compareValue;

    @ApiModelProperty(value = "指标数值")
    private BigDecimal indicatorValue;

    @ApiModelProperty(value = "手工调整项")
    private BigDecimal adjustValue;

    @ApiModelProperty(value = "调整后数值")
    private BigDecimal afterAdjustValue;

    @ApiModelProperty(value = "备注")
    private String remark;

    @ApiModelProperty(value = "节点ID")
    private String node;

    @ApiModelProperty(value = "父节点ID")
    private String parentNode;

    @ApiModelProperty(value = "创建时间,系统时间")
    private Date createDate;

    @ApiModelProperty(value = "子标签")
    private List<ResourcePoolDetailVO> children;

    public ResourcePoolDetailVO(ResourcePoolDetailDO srcData){
        if(srcData != null) {
            BeanUtils.copyProperties(srcData, this);
        }
    }
}

tree工具类

public class MenuTreeUtil {

    //建立树形结构
    public static <T extends MenuTreeNode> List<? extends MenuTreeNode> buildTree(List<? extends MenuTreeNode> detailDOS){
        List<MenuTreeNode> treeMenus =new  ArrayList<>();
        for(MenuTreeNode menuNode : getRootNode(detailDOS)) {
            menuNode=buildChildTree(menuNode,detailDOS);
            treeMenus.add(menuNode);
        }
        return treeMenus;
    }

    //递归,建立子树形结构
    private static MenuTreeNode buildChildTree(MenuTreeNode pNode, List<? extends MenuTreeNode> detailDOS){
        List<MenuTreeNode> childMenus =new  ArrayList<>();
        for(MenuTreeNode menuNode : detailDOS) {
            if(menuNode.getParentNode().equals(pNode.getNode())) {
                childMenus.add(buildChildTree(menuNode,detailDOS));
            }
        }
        if(CollectionUtils.isNotEmpty(childMenus)){
            pNode.setChildren(childMenus);
        }
        return pNode;
    }

    //获取根节点
    private static List<? extends MenuTreeNode> getRootNode(List<? extends MenuTreeNode> detailDOS) {
        List<MenuTreeNode> rootMenuLists =new ArrayList<>();
        for(MenuTreeNode menuNode : detailDOS) {
            if(menuNode.getParentNode().equals("0")) {
                rootMenuLists.add(menuNode);
            }
        }
        return rootMenuLists;
    }

    /**
     * 将树状结构转换为平铺数据结构(将含有children的树状结构转换为仅有节点和父节点的对象列表)
     * @param detailDOS 树状结构数据列表
     * @param <T> 任意类型参数
     * @return 平铺数据结构列表
     */
    public static <T extends MenuTreeNode> List<? extends MenuTreeNode> convertToObjList(List<? extends MenuTreeNode> detailDOS){

        List<MenuTreeNode> treeMenus =new  ArrayList<>();
        for (MenuTreeNode menuNode  : detailDOS) {
            if (menuNode.getChildren() != null) {
                treeMenus.add(menuNode);
                convertToObjList(menuNode.getChildren(), treeMenus);
            } else {
                treeMenus.add(menuNode);
            }
        }
        return treeMenus;
    }

    public static <T extends MenuTreeNode> void convertToObjList(List<? extends MenuTreeNode> source ,
                                                                                         List<MenuTreeNode> outList){
        if(outList==null){
            outList = new ArrayList<>();
        }
        for (MenuTreeNode tTreeStructure : source) {
            if (tTreeStructure.getChildren() != null) {
                outList.add(tTreeStructure);
                convertToObjList(tTreeStructure.getChildren(), outList);
            } else {
                outList.add(tTreeStructure);
            }
        }
    }

}

将数据转换成树形结构

List<ResourcePoolDetailVO> detailVOS = new ArrayList<>();
List<ResourcePoolDetailVO> resultVOs = (List<ResourcePoolDetailVO>) MenuTreeUtil.buildTree(detailVOS);

将树形结构转换成扁平数据

List<ResourcePoolDetailVO> detailVOS = new ArrayList<>();
List<ResourcePoolDetailVO> detailVOS = (List<ResourcePoolDetailVO>) MenuTreeUtil.convertToObjList(detailVOS);
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值