实体
public class Category {
private String id;
private String name;
private String pid;
private List<Category> children;
}
树形展示数据,id为整型
public List<Category> list(){
List<Category> list= categoryMapper.list();
return (createTree(null,list));//null 从第一级开始递归
}
//完全递归实现递归树
private List<Category> createTree(Integer pid, List<Category> categories) {
List<Category> treeList = new ArrayList<>();
for (Category category : categories) {
// 如果pid为null,检查分类的父ID是否也为null,即第一级节点
if ( pid==null ){
if (category.getPid() == null){ //第一级节点
treeList.add(category);
// 递归调用createTree方法,为当前节点设置子节点
category.setChildren(createTree(category.getId(),categories));
}
}else { // 如果pid不为null,检查分类的父ID是否与传入的pid匹配
if (pid.equals(category.getPid())) {
treeList.add(category);
category.setChildren(createTree(category.getId(), categories));
}
}
}
return treeList;
}
树形展示数据,id为字符串型,且一个可能有多个父id
public List<Category> list(){
List<Category> list= categoryMapper.list();
return (createTree(null,list));//null 从第一级开始递归
}
//完全递归实现递归树
private List<Category> createTree(String pid, List<Category> categories) {
List<Category> treeList = new ArrayList<>();
for (Category category : categories) {
// 如果pid为null,检查分类的父ID是否也为null,即第一级节点
if (pid == null) {
if (category.getPid() == null) { // 第一级节点
treeList.add(category);
// 递归调用createTree方法,为当前节点设置子节点
category.setChildren(createTree(category.getId(), categories));
}
} else {
//先把id分开
//逐个比对
if (category.getPid()!= null) {
String PidS = category.getPid();
String[] pids = PidS.split(",");
for (String p : pids) {
if (p.equals(pid)) {
treeList.add(category);
category.setChildren(createTree(category.getId(), categories));
break; // 找到匹配的pid后,跳出循环
}
}
}
}
}
return treeList;
}
结果展示
"data": [
{
"id": "4",
"name": "B",
"pid": null,
"children": [
{
"id": "6",
"name": "B2",
"pid": "4",
"children": [
{
"id": "10",
"name": "aabb",
"pid": "5,6",
"children": []
}
]
},
{
"id": "5",
"name": "B1",
"pid": "4",
"children": [
{
"id": "10",
"name": "aabb",
"pid": "5,6",
"children": []
}
]
}
]
},
{
"id": "1",
"name": "A",
"pid": null,
"children": [
{
"id": "3",
"name": "A2",
"pid": "1",
"children": [
{
"id": "8",
"name": "A12",
"pid": "2,3",
"children": []
}
]
},
{
"id": "2",
"name": "A1",
"pid": "1",
"children": [
{
"id": "9",
"name": "A11a",
"pid": "7,2",
"children": []
},
{
"id": "8",
"name": "A12",
"pid": "2,3",
"children": []
},
{
"id": "7",
"name": "A11",
"pid": "2",
"children": [
{
"id": "9",
"name": "A11a",
"pid": "7,2",
"children": []
}
]
}
]
}
]
}
],
优化
public List<Category> list() {
List<Category> list = categoryMapper.list();
Map<String, Category> categoryMap = new HashMap<>();
for (Category category : list) {
categoryMap.put(category.getId(), category);
}
return createTree(null, categoryMap);
}
private List<Category> createTree(String pid, Map<String, Category> categoryMap) {
List<Category> treeList = new ArrayList<>();
for (Map.Entry<String, Category> entry : categoryMap.entrySet()) {
Category category = entry.getValue();
if (pid == null) {
if (category.getPid() == null) { // 第一级节点
treeList.add(category);
category.setChildren(createTree(category.getId(), categoryMap));
}
} else {
if (category.getPid()!= null) {
String PidS = category.getPid();
String[] pids = PidS.split(",");
for (String p : pids) {
if (p.equals(pid)) {
treeList.add(category);
category.setChildren(createTree(category.getId(), categoryMap));
break;
}
}
}
}
}
return treeList;
}
继续优化,需要在实体类里加属性 private Set<String> pidSet;
public List<Category> list() {
List<Category> list = categoryMapper.list();
Map<String, Category> categoryMap = list.stream()
.collect(Collectors.toMap(Category::getId, category -> category));
// 预处理 pid,转换为 Set
for (Category category : list) {
if (category.getPid() != null) {
category.setPidSet(new HashSet<>(Arrays.asList(category.getPid().split(","))));
}
}
return createTree(null, categoryMap);
}
private List<Category> createTree(String pid, Map<String, Category> categoryMap) {
return categoryMap.values().stream()
.filter(category -> isChildOf(category, pid))
.peek(category -> category.setChildren(createTree(category.getId(), categoryMap)))
.collect(Collectors.toList());
}
private boolean isChildOf(Category category, String pid) {
if (pid == null) {
return category.getPid() == null;
}
return category.getPidSet() != null && category.getPidSet().contains(pid);
}