实体父类
@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);