以下是Java实现树形List与扁平List互转的完整攻略。
1. 概述
树形结构和扁平结构是常用的数据结构之一,在业务开发过程中常常需要互相转换。本攻略给出Java实现树形List与扁平List互转的示例代码。
2. 树形List转为扁平List
树形结构的定义:
public class TreeNode {
private String id;
private String parentId;
private String name;
private List<TreeNode> children = new ArrayList<>();
// get/set方法省略
}
树形List的数据示例:
List<TreeNode> treeNodes = new ArrayList<>();
treeNodes.add(new TreeNode("1", null, "节点1"));
treeNodes.add(new TreeNode("2", "1", "节点2-1"));
treeNodes.add(new TreeNode("3", "1", "节点2-2"));
treeNodes.add(new TreeNode("4", "2", "节点3-1"));
其中,TreeNode
类中的parentId
代表该节点的父节点ID,根节点的父节点ID设为null
。
扁平结构的定义:
public class FlatNode {
private String id;
private String parentId;
private String name;
// get/set方法省略
}
树形List转为扁平List的示例代码:
public List<FlatNode> treeNodesToFlatNodes(List<TreeNode> treeNodes) {
List<FlatNode> flatNodes = new ArrayList<>();
for (TreeNode treeNode : treeNodes) {
flatNodes.add(new FlatNode(treeNode.getId(), treeNode.getParentId(), treeNode.getName()));
if (treeNode.getChildren().size() > 0) {
flatNodes.addAll(treeNodesToFlatNodes(treeNode.getChildren()));
}
}
return flatNodes;
}
通过遍历树形List的每个节点,生成扁平结构,如果有子节点,则递归生成子节点的扁平结构。
3. 扁平List转为树形List
扁平结构的定义:
public class FlatNode {
private String id;
private String parentId;
private String name;
// get/set方法省略
}
扁平List的数据示例:
List<FlatNode> flatNodes = new ArrayList<>();
flatNodes.add(new FlatNode("1", null, "节点1"));
flatNodes.add(new FlatNode("2", "1", "节点2-1"));
flatNodes.add(new FlatNode("3", "1", "节点2-2"));
flatNodes.add(new FlatNode("4", "2", "节点3-1"));
其中,FlatNode
类中的parentId
代表该节点的父节点ID,根节点的父节点ID设为null
。
树形结构的定义:
public class TreeNode {
private String id;
private String parentId;
private String name;
private List<TreeNode> children = new ArrayList<>();
// get/set方法省略
}
扁平List转为树形List的示例代码:
public List<TreeNode> flatNodesToTreeNodes(List<FlatNode> flatNodes) {
Map<String, TreeNode> map = new HashMap<>();
List<TreeNode> rootNodes = new ArrayList<>();
for (FlatNode flatNode : flatNodes) {
map.put(flatNode.getId(), new TreeNode(flatNode.getId(), flatNode.getParentId(), flatNode.getName()));
}
for (FlatNode flatNode : flatNodes) {
TreeNode treeNode = map.get(flatNode.getId());
if (flatNode.getParentId() == null) {
rootNodes.add(treeNode);
} else {
map.get(flatNode.getParentId()).getChildren().add(treeNode);
}
}
return rootNodes;
}
遍历扁平List的每个节点,根据每个节点的父节点ID,建立节点之间的父子关系,同时将节点加入到父节点的子节点列表中,若该节点没有父节点,则为根节点。
4. 示例说明
假设有以下树形List结构的treeNodes
数据:
List<TreeNode> treeNodes = new ArrayList<>();
treeNodes.add(new TreeNode("1", null, "节点1"));
treeNodes.add(new TreeNode("2", "1", "节点2-1"));
treeNodes.add(new TreeNode("3", "1", "节点2-2"));
treeNodes.add(new TreeNode("4", "2", "节点3-1"));
对treeNodes
进行转换,生成扁平List结构的flatNodes
数据:
List<FlatNode> flatNodes = treeNodesToFlatNodes(treeNodes);
期望得到的flatNodes
数据如下:
[
{id: 1, parentId: null, name: "节点1"},
{id: 2, parentId: "1", name: "节点2-1"},
{id: 4, parentId: "2", name: "节点3-1"},
{id: 3, parentId: "1", name: "节点2-2"}
]
再将flatNodes
转换为树形List结构的treeNodes2
数据:
List<TreeNode> treeNodes2 = flatNodesToTreeNodes(flatNodes);
期望得到的treeNodes2
数据如下:
[
{
id: 1,
parentId: null,
name: "节点1",
children: [
{
id: 2,
parentId: "1",
name: "节点2-1",
children: [
{id: 4, parentId: "2", name: "节点3-1", children: []}
]
},
{
id: 3,
parentId: "1",
name: "节点2-2",
children: []
}
]
}
]
以上就是Java实现树形List与扁平List互转的完整攻略,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现树形List与扁平List互转的示例代码 - Python技术站