对象
关系对象
public class Model {
private String id;
private String name;
private Model parent;
// 省略 get、set
}
树形对象
public class ModelNode{
private String id;
priate String name;
private int count;
private List<ModelNode> modelNodes;
// 省略 get、set
}
构建树
/**
* 构建树
*
* @param models 所有对象
* @param 树
*/
public static List<ModelNode> buildTree(List<Model> models) {
List<ModelNode> models = new ArrayList<>();
models.forEach(model -> {
// ROOT(s)
if (null == model.getParent()) {
ModelNode modelNode = toNode(model);
models.add(modelNode);
addChildren(models, model.getId(), modelNode);
}
});
return models;
}
/**
* 添加子节点
*
* @param models 所有对象
* @param id 当前节点ID
* @param modelNode 当前节点的树形结构对象
*/
private static void addChildren(List<Model> models, String id, ModelNode modelNode) {
models.forEach(model -> {
// 有父节点且父节点ID是当前传入节点
if (null != model.getParent() && id.equals(model.getParent().getId())) {
// 创建当前节点
ModelNode children = toNode(model);
// 添加当前节点为传入节点的子节点
modelNode.getChildren().add(children);
// 添加当前节点的子节点
addChildren(models, model.getId(), children);
}
});
}
打印树
参考链接 https://stackoverflow.com/questions/4965335/how-to-print-binary-tree-diagram-in-java
代码
/**
* 打印树
*
* @param modelNodes 模型树
*/
private static void printTree(List<ModelNode> modelNodes) {
StringBuilder stringBuilder = new StringBuilder();
modelNodes.forEach(modelNode -> buildTreeInfo(modelNode, stringBuilder, "", "", modelNode.getChildren()));
log.debug("show model tree diagram \n {}", stringBuilder);
}
private static void buildTreeInfo(ModelNode modelNode, StringBuilder buffer, String prefix, String childrenPrefix, List<ModelNode> children) {
buffer.append(prefix);
buffer.append(modelNode.getName());
buffer.append('\n');
if (null == children) {
return;
}
for (Iterator<ModelNode> it = children.iterator(); it.hasNext(); ) {
BizModelTreeDTO next = it.next();
if (it.hasNext()) {
buildTreeInfo(next, buffer, childrenPrefix + "├── ", childrenPrefix + "│ ", next.getChildren());
} else {
buildTreeInfo(next, buffer, childrenPrefix + "└── ", childrenPrefix + " ", next.getChildren());
}
}
}