树型结构如果用二维表格保存时
当然如果计设时增加 一些辅助子段 是否为叶子 层级编码 01 0101 0102 010201 010202
这时查询是很容易的
只有一个parentId的情况
如何查询一个结点的所有子孙结点呢?
package com.gzz.sys;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.util.CollectionUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 高振中
* @date 2023-06-18 00:16:57
**/
public class Tree {
public static void main(String[] args) {
List<Integer> result = new ArrayList<>();
List<Classfy> classfys = List.of(
new Classfy(1,0,1) ,
new Classfy(2,1,2),
new Classfy(3,2,3),
new Classfy(4,2,4),
new Classfy(5,1,5),
new Classfy(6,5,6),
new Classfy(7,5,7),
new Classfy(8,7,8),
new Classfy(9,5,9),
new Classfy(10, 9, 10));
Map<Integer, Classfy> treeMap = new HashMap<>();
classfys.forEach(dept -> {
treeMap.put(dept.getId(), dept);
if (dept.getParentId() != 0)
treeMap.get(dept.getParentId()).getChildren().add(dept);
});
List<Integer> param = List.of(5);
for (Integer id : param)
children(treeMap.get(id), result);
System.out.println(result);
}
static void children(Classfy classfy, List<Integer> result) {
List<Classfy> children = classfy.getChildren();
if (!CollectionUtils.isEmpty(children))
children.forEach(child -> children(child, result));
result.add(classfy.getId());
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Classfy {
public Classfy(Integer id, Integer parentId, Integer name) {
super();
this.id = id;
this.parentId = parentId;
this.name = name;
}
private Integer id;
private Integer parentId;
private Integer name;
private List<Classfy> children = new ArrayList<>();
}
网友评论