要将List集合转换为树形结构,通常需要一个树形结构的实体类,该类包含了父子关系的标识。以下是一个简单的示例,假设我们有一个实体类TreeNode
,它有一个id
和一个parentId
字段,以及用于子节点的children
列表:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class TreeNode {
int id;
int parentId;
List<TreeNode> children;
TreeNode(int id, int parentId) {
this.id = id;
this.parentId = parentId;
this.children = new ArrayList<>();
}
}
public class ListToTree {
public static List<TreeNode> listToTree(List<TreeNode> nodes) {
Map<Integer, TreeNode> nodeMap = new HashMap<>();
for (TreeNode node : nodes) {
nodeMap.put(node.id, node);
}
List<TreeNode> rootNodes = nodes.stream()
.filter(node -> node.parentId == -1) // 假设-1表示根节点
.collect(Collectors.toList());
for (TreeNode parent : rootNodes) {
addChild(nodeMap, parent);
}
return rootNodes;
}
private static void addChild(Map<Integer, TreeNode> nodeMap, TreeNode parent) {
List<TreeNode> children = nodes.stream()
.filter(node -> node.parentId == parent.id)
.collect(Collectors.toList());
for (TreeNode child : children) {
parent.children.add(child);
addChild(nodeMap, child);
}
}
public static void main(String[] args) {
// 示例数据
List<TreeNode> nodes = Arrays.asList(
new TreeNode(1, -1),
new TreeNode(2, 1),
new TreeNode(3, 1),
new TreeNode(4, 2),
new TreeNode(5, -1)
);
List<TreeNode> tree = listToTree(nodes);
// 打印结果
for (TreeNode node : tree) {
System.out.println(node);
}
}
}
在这个例子中,listToTree
方法首先创建了一个映射,用于快速访问所有节点。然后,它找到所有根节点(在这个例子中,根节点的parentId
被假设为-1),并递归地为每个根节点添加子节点。最后,返回根节点列表构成的树。