java根据对象的PID字段,生成树形结构的工具类
用需要生成树形结构的类集成一下CO调用下工具类就可以实现了
测试数据如下:
相关工具的代码如下:
import lombok.Data;
import java.io.Serializable;
/**
* base client object
* @author cwj
* @version 1.0
*/
@Data
public abstract class BaseCO implements Serializable {
/**
* 唯一编号
*/
private String id;
}
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Objects;
/**
* tree CO
* cwj
* @version 1.0
*/
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class BaseTreeCO<CO extends BaseCO> extends BaseCO {
/**
* 子节点
*/
private List<CO> children;
/**
* 获取 pid
*/
public abstract String getPid();
public void initChildren() {
if (Objects.isNull(getChildren())) {
this.setChildren(Lists.newArrayList());
}
}
}
import lombok.experimental.UtilityClass;
import org.springframework.util.CollectionUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 树帮助类
* cwj
* @version 1.0
*/
@UtilityClass
public class TreeHelper {
/**
* 构建 tree
* @param treeList
* @param <CO>
* @return
*/
public <CO extends BaseTreeCO<CO>> List<CO> buildTree(List<CO> treeList) {
if (CollectionUtils.isEmpty(treeList)) {
return treeList;
}
//记录自己是自己的父节点的id集合
List<Serializable> selfIdEqSelfParent = new ArrayList<>();
// 为每一个节点找到子节点集合
for (CO parent : treeList) {
Serializable id = parent.getId();
for (CO children : treeList) {
if (parent != children) {
//parent != children 这个来判断自己的孩子不允许是自己,因为有时候,根节点的parent会被设置成为自己
if (id.equals(children.getPid())) {
parent.initChildren();
parent.getChildren().add(children);
}
} else if (id.equals(parent.getPid())) {
selfIdEqSelfParent.add(id);
}
}
}
// 找出根节点集合
List<CO> trees = new ArrayList<>();
List<? extends Serializable> allIds = treeList.stream().map(node -> node.getId()).collect(Collectors.toList());
for (CO baseNode : treeList) {
if (!allIds.contains(baseNode.getPid()) || selfIdEqSelfParent.contains(baseNode.getPid())) {
trees.add(baseNode);
}
}
return trees;
}
}
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class AreaPARAM extends BaseTreeCO<AreaPARAM> {
/**
* 区域名字
*/
private String areaName;
/**
* 父ID
*/
private String pid;
}