public abstract class TreeBean<T extends TreeBean>{
private String id;
private String parentId;
private List<T> children;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public List<T> getChildren() {
return children;
}
public void setChildren(List<T> children) {
this.children = children;
}
public <T extends TreeBean> List<T> buildTree(List<T> result){
List<T> treeList = new ArrayList<>();
if(result==null||result.size()<=0) return treeList;
List<String> ids = result.stream().map(t->t.getId()).collect(Collectors.toList());
//从根节点建树
for (T t : result) {
//没有上级的时候,都可以当根结点
if (t.getParentId() == null||!ids.contains(t.getParentId())) {
recursiveBuild(t, result);
treeList.add(t);
}
}
return treeList;
}
/**递归当前节点构建
*
* @param parentNode
* @param dataList
*/
private <T extends TreeBean> void recursiveBuild(T parentNode, List<T> dataList) {
List<T> children = new ArrayList<>();
for (T t : dataList) {
if (t.getParentId() != null && t.getParentId().equals(parentNode.getId())) {
recursiveBuild(t, dataList);
children.add(t);
}
}
parentNode.setChildren(children);
afterBuildSingleTree(parentNode,children);
}
/**单个树枝构建完成后的处理,子类实现(父子要有其他联系操作,如子节点某个数据需要汇总到父节点上)
*
* @param parent
* @param children
* @param <T>
*/
abstract <T extends TreeBean> void afterBuildSingleTree(T parent,List<T> children);
}
构建树父类
于 2024-05-08 23:46:37 首次发布