1、工具类
说明:
1.提供tree转list, list转tree两个方法,需要借助TreeNode接口然后实体类来实现。当然可以通过反射手段代替接口。
2.自己定义root标准,我这里是判断root的pid为’0"。(一般为"0"或null)
3.自定定义id类型,我这里是String类型。(一般为"Stirng"或"Long")
4.可以继续封装,定义TreeNodeImpl然后让实体类继承,这里不给出了。
/**
* @author zevin
* @date 2023/6/13 19:26
*/
public class TreeUtil {
/**
* 树节点接口
*
* @param <ID> id类型
*/
public interface TreeNode<T extends TreeNode<T, ID>, ID> {
ID getId();
ID getParentId();
boolean isRoot();
Integer getSort();
List<T> getChildren();
T setChildren(List<T> children);
}
/**
* list转tree
*
* @param all 所有节点
*/
public static <T extends TreeNode<T, ID>, ID> List<T> list2Tree(List<T> all) {
return list2Tree(null, all);
}
/**
* list转tree
*
* @param parent 父节点
* @param all 所有节点
*/
public static <T extends TreeNode<T, ID>, ID> List<T> list2Tree(T parent, List<T> all) {
return all.stream()
.filter(node -> parent == null ? node.isRoot() : node.getParentId() != null && node.getParentId().equals(parent.getId()))
.map(node -> node.setChildren(list2Tree(node, all)))
.sorted(Comparator.comparingInt(TreeNode::getSort))
.collect(Collectors.toList());
}
/**
* tree转list
*
* @param all 所有节点
*/
public static <T extends TreeNode<T, ID>, ID> List<T> tree2List(List<T> all) {
return tree2List(all, new ArrayList<>());
}
/**
* list转tree
*
* @param layer 同一层节点
* @param nodeList 节点列表
*/
public static <T extends TreeNode<T, ID>, ID> List<T> tree2List(List<T> layer, List<T> nodeList) {
if (nodeList == null) nodeList = new ArrayList<>();
if (layer == null || layer.isEmpty()) return nodeList;
nodeList.addAll(layer);
for (T item : layer) tree2List(item.getChildren(), nodeList);
return nodeList;
}
}
2、测试
/**
* 模拟实体类
*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public static class Entity implements TreeNode<Entity, String>{
private String id;
private String pid;
private Integer sort;
private List<Entity> children;
@Override
public List<Entity> getChildren() {
return children;
}
@Override
public Entity setChildren(List<Entity> children) {
this.children = children;
return this;
}
@Override
public Integer getSort() {
return sort;
}
@Override
public String getParentId() {
return pid;
}
@Override
public String getId() {
return id;
}
@Override
public boolean isParentId() {
return "0".equals(pid);
}
}
/**
* 测试
*/
public static void main(String[] args) {
//1.准备数据
Entity n1 = new Entity().setId("1").setPid("0").setSort(1);
Entity n2 = new Entity().setId("2").setPid("0").setSort(2);
Entity n3 = new Entity().setId("3").setPid("0").setSort(3);
Entity n1_1 = new Entity().setId("1-1").setPid("1").setSort(1);
Entity n1_2 = new Entity().setId("1-2").setPid("1").setSort(2);
Entity n1_3 = new Entity().setId("1-3").setPid("1").setSort(3);
Entity n2_1 = new Entity().setId("2-1").setPid("2").setSort(1);
Entity n2_2 = new Entity().setId("2-2").setPid("2").setSort(2);
Entity n2_3 = new Entity().setId("2-3").setPid("2").setSort(3);
Entity n1_1_1 = new Entity().setId("1-1-1").setPid("1-1").setSort(1);
Entity n1_1_2 = new Entity().setId("1-1-2").setPid("1-1").setSort(2);
Entity n1_1_3 = new Entity().setId("1-1-3").setPid("1-1").setSort(3);
//2.拼接tree
n1.setChildren(Arrays.asList(n1_1, n1_2, n1_3));
n2.setChildren(Arrays.asList(n2_1, n2_2, n2_3));
n1_1.setChildren(Arrays.asList(n1_1_1, n1_1_2, n1_1_3));
List<Entity> originalTree = new ArrayList<>(Arrays.asList(n1, n2, n3));
//3.list和tree互转
List<Entity> list = tree2List(originalTree);
List<Entity> tree = list2Tree(list);
// List<Entity> list = tree2List(originalTree, new ArrayList<>());
// List<Entity> tree = list2Tree(null, list);
//4.断点,查看结果
System.out.println(list);
System.out.println(tree);
}