那你帮我写一个java的通用树结构转换工具类吧
时间: 2024-02-20 19:02:17 浏览: 92
当然可以,以下是一个简单的 Java 通用树结构转换工具类:
```java
import java.util.ArrayList;
import java.util.List;
public class TreeUtils {
/**
* 将通用树结构转换为指定类型的树结构
*
* @param sourceList 原始树结构列表
* @param rootId 根节点 ID
* @param builder 转换器
* @param <T> 目标树结构节点类型
* @return 目标树结构列表
*/
public static <T extends TreeNode> List<T> convertTree(List<? extends TreeNode> sourceList, String rootId, TreeBuilder<T> builder) {
List<T> targetList = new ArrayList<>();
for (TreeNode sourceNode : sourceList) {
if (rootId.equals(sourceNode.getParentId())) {
T targetNode = builder.build(sourceNode);
targetNode.setChildren(getChildren(sourceNode.getId(), sourceList, builder));
targetList.add(targetNode);
}
}
return targetList;
}
/**
* 获取指定节点的子节点列表
*
* @param parentId 父节点 ID
* @param sourceList 原始树结构列表
* @param builder 转换器
* @param <T> 目标树结构节点类型
* @return 子节点列表
*/
private static <T extends TreeNode> List<T> getChildren(String parentId, List<? extends TreeNode> sourceList, TreeBuilder<T> builder) {
List<T> children = new ArrayList<>();
for (TreeNode sourceNode : sourceList) {
if (parentId.equals(sourceNode.getParentId())) {
T targetNode = builder.build(sourceNode);
targetNode.setChildren(getChildren(sourceNode.getId(), sourceList, builder));
children.add(targetNode);
}
}
return children;
}
/**
* 树结构节点接口
*/
public interface TreeNode {
/**
* 获取节点 ID
*
* @return 节点 ID
*/
String getId();
/**
* 获取父节点 ID
*
* @return 父节点 ID
*/
String getParentId();
}
/**
* 树结构节点构建器接口
*
* @param <T> 目标树结构节点类型
*/
public interface TreeBuilder<T extends TreeNode> {
/**
* 构建目标树结构节点
*
* @param sourceNode 原始树结构节点
* @return 目标树结构节点
*/
T build(TreeNode sourceNode);
}
}
```
使用方法示例:
假设有一个 `Node` 类,表示通用树结构节点,包含 `id`、`parentId`、`name` 等属性。现在需要将 `Node` 类型的通用树结构转换为 `Menu` 类型的树结构,其中 `Menu` 类型的节点包含 `id`、`parentId`、`name`、`url` 等属性。可以按以下步骤进行转换:
1. 定义 `Menu` 类型的节点:
```java
public class Menu implements TreeUtils.TreeNode {
private String id;
private String parentId;
private String name;
private String url;
private List<Menu> children;
// 省略 getter 和 setter 方法
}
```
2. 定义 `Menu` 类型的节点构建器:
```java
public class MenuBuilder implements TreeUtils.TreeBuilder<Menu> {
@Override
public Menu build(TreeUtils.TreeNode sourceNode) {
Node node = (Node) sourceNode;
Menu menu = new Menu();
menu.setId(node.getId());
menu.setParentId(node.getParentId());
menu.setName(node.getName());
menu.setUrl(node.getUrl());
return menu;
}
}
```
3. 调用 `TreeUtils.convertTree()` 方法进行转换:
```java
List<Node> nodeList = ... // 原始树结构列表
List<Menu> menuList = TreeUtils.convertTree(nodeList, "root", new MenuBuilder());
```
其中,`nodeList` 是原始树结构列表,`"root"` 是根节点 ID,`new MenuBuilder()` 是 `Menu` 类型的节点构建器。
希望这个工具类能对你有所帮助!
阅读全文