Node:
public class Node {
public Node(String name, Integer id, Integer pid) {
this.name = name;
this.id = id;
this.pid = pid;
}
private String name;
private Integer id;
private Integer pid;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
@Override
public String toString() {
return "Node{" +
"name='" + name + '\'' +
", id=" + id +
", pid=" + pid +
'}';
}
}
TreeNode:
package com.p7.framework.http.push;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class TreeNode<T> implements Serializable{
private T data;
private List<TreeNode<T>> childrenNode = new ArrayList<>();
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public List<TreeNode<T>> getChildrenNode() {
return childrenNode;
}
public void setChildrenNode(List<TreeNode<T>> childrenNode) {
this.childrenNode = childrenNode;
}
public TreeNode(T data, List<TreeNode<T>> childrenNode) {
this.data = data;
this.childrenNode = childrenNode;
}
public TreeNode(T data) {
this.data = data;
}
public TreeNode() {
}
@Override
public String toString() {
return "TreeNode{" +
"data=" + data +
", childrenNode=" + childrenNode +
'}';
}
}
ConvertTree:
import java.lang.reflect.Field;
import java.util.List;
public class ConvertTree<T> {
/**
* 根节点数据
*/
private T root;
/**
* 节点树
*/
private TreeNode<T> tree;
public T getRoot() {
return root;
}
/**
* 获取节点树
*
* @return
*/
public TreeNode<T> getTree() {
return tree;
}
/**
* 添加节点到节点树
*
* @param data 节点
* @param idName 节点id名称
* @param fIdName 父节点id名称
*/
public void put(T data, String idName, String fIdName) {
if (root == null) {
root = data;
tree = new TreeNode<>(data);
} else {
String fieldValue = getFieldValue(data, fIdName);
String rootFiledValue = getFieldValue(root, idName);
if (rootFiledValue.equals(fieldValue)) {
List<TreeNode<T>> childrenNode = tree.getChildrenNode();
childrenNode.add(new TreeNode<T>(data));
} else {
put(data, idName, fIdName, tree.getChildrenNode());
}
}
}
/**
* 添加节点到节点树
*
* @param data 节点
* @param idName 节点id名称
* @param fIdName 父节点id名称
* @param childrenNode 子节点集合
*/
private void put(T data, String idName, String fIdName, List<TreeNode<T>> childrenNode) {
if (childrenNode == null || childrenNode.isEmpty()) {
return;
} else {
for (TreeNode<T> tTreeNode : childrenNode) {
String fieldValue = getFieldValue(data, fIdName);
String rootFiledValue = getFieldValue(tTreeNode.getData(), idName);
if (rootFiledValue.equals(fieldValue)) {
List<TreeNode<T>> children = tTreeNode.getChildrenNode();
children.add(new TreeNode<T>(data));
return;
} else {
List<TreeNode<T>> children = tTreeNode.getChildrenNode();
put(data, idName, fIdName, children);
}
}
}
}
/**
* 查找父节点
*
* @param t
* @param idName
* @param fIdName
* @return
*/
public T find(T t, String idName, String fIdName) {
T data = tree.getData();
String fieldValue = getFieldValue(data, idName);
String value = getFieldValue(t, fIdName);
if (value.equals(fieldValue)) {
return data;
}
return find(t, idName, fIdName, tree.getChildrenNode());
}
/**
* 查找父节点
*
* @param t
* @param idName
* @param fIdName
* @param childrenNode
* @return
*/
public T find(T t, String idName, String fIdName, List<TreeNode<T>> childrenNode) {
if (childrenNode.isEmpty()) {
return null;
}
T tem = null;
for (TreeNode<T> tTreeNode : childrenNode) {
if (tem != null) {
break;
}
T data = tTreeNode.getData();
String fieldValue = getFieldValue(data, idName);
String value = getFieldValue(t, fIdName);
if (value.equals(fieldValue)) {
return data;
} else {
tem = find(t, idName, fIdName, tTreeNode.getChildrenNode());
}
}
return tem;
}
/**
* 获取字段值
*
* @param o class
* @param fieldName 字段名
* @return String
*/
public String getFieldValue(T o, String fieldName) {
//得到class
Class cls = o.getClass();
//得到所有属性
Field field = null;
try {
field = getFieldByFieldName(cls, fieldName);
} catch (NoSuchFieldException e) {
try {
field = cls.getSuperclass().getDeclaredField(fieldName);
} catch (NoSuchFieldException ex) {
throw new RuntimeException("获取属性值失败");
}
}
try {
//打开私有访问
field.setAccessible(true);
//获取属性
Object result = field.get(o);
if (result == null) {
return null;
}
return result.toString();
} catch (IllegalAccessException e) {
throw new RuntimeException("获取属性值失败");
}
}
public Field getFieldByFieldName(Class<?> clazz, String fieldName) throws NoSuchFieldException {
for (; !clazz.equals(Object.class); clazz = clazz.getSuperclass()) {
try {
return clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
}
}
throw new NoSuchFieldException();
}
}
测试:
public static void main(String[] args) {
ConvertTree<Node> convertTree = new ConvertTree<>();
Node node = new Node("根节点", 1, 0);
Node node1 = new Node("A", 2, 1);
Node node2 = new Node("AA", 3, 2);
Node node3 = new Node("B", 4, 1);
Node node4 = new Node("BB", 5, 4);
convertTree.put(node, "id", "pid");
convertTree.put(node1, "id", "pid");
convertTree.put(node2, "id", "pid");
convertTree.put(node3, "id", "pid");
convertTree.put(node4, "id", "pid");
System.out.println(convertTree.tree);
}