有一张表,包含很多分类数据,其中有一个字段 parentId,可以指向表中父节点的id,现在查询这张表,需要把数据按照层级,以树状列表形式返回,用java代码实现这个查询
时间: 2023-05-28 14:03:20 浏览: 338
MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
首先,需要定义一个节点类,用于存储每个节点的信息。
```
public class Node {
private int id;
private String name;
private int parentId;
private List<Node> children;
public Node(int id, String name, int parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
children = new ArrayList<>();
}
// getters and setters
}
```
然后,需要定义一个方法,将所有节点按照层级关系组织成树状结构。可以使用递归的方式实现。
```
public List<Node> buildTree(List<Node> nodes) {
Map<Integer, List<Node>> map = new HashMap<>();
for (Node node : nodes) {
int parentId = node.getParentId();
if (!map.containsKey(parentId)) {
map.put(parentId, new ArrayList<>());
}
map.get(parentId).add(node);
}
List<Node> rootNodes = map.get(0);
for (Node rootNode : rootNodes) {
addChildNodes(rootNode, map);
}
return rootNodes;
}
private void addChildNodes(Node parentNode, Map<Integer, List<Node>> map) {
int id = parentNode.getId();
if (map.containsKey(id)) {
List<Node> childNodes = map.get(id);
for (Node childNode : childNodes) {
addChildNodes(childNode, map);
}
parentNode.setChildren(childNodes);
}
}
```
最后,调用这个方法,将查询结果转换为树状结构。
```
List<Node> nodes = ...; // 查询结果
List<Node> tree = buildTree(nodes);
```
阅读全文