一、背景
需求:同一张表中存放有自己的Pid,查找出树形结构(类似目录)。
工具:Map、List
二、步骤
1、在实体对象中创建一个child属性
2、新建一个List集合用来存放返回数据
3、将所有数据查询出来存放到一个list中
4、将所有数据以 数据ID为key,数据为value 放入map中
5、遍历List,在循环中判读当前对象是否是最顶端的父节点,
是:把此对象放到返回数据的集合里面
否:利用当前对象和Map,找出当前对象的父节点,并放到父节点下面的child属性中。
三、实例代码
实体对象代码:
@Data
public class TbStandardCatalogue implements Serializable {
/**条目id*/
private java.lang.String id;
/**父节点id*/
private java.lang.String pid;
/**标准id*/
private java.lang.String standardId;
/**排序*/
private java.lang.Integer sort;
/**条目名称*/
private java.lang.String catalogueName;
/**条目内容*/
private java.lang.String catalogueContent;
/**标准条目分类*/
private java.lang.String standardCatalogueClassify;
/**备注*/
private java.lang.String remark;
/**状态(是否被删除)*/
private java.lang.Integer status;
@TableField(exist = false)
private ArrayList<TbStandardCatalogue> child=new ArrayList<>();
}
套娃代码:
public ArrayList<TbStandardCatalogue> queryByStandardId(String standardId) {
//返回结果
ArrayList<TbStandardCatalogue> result=new ArrayList<>();
//根据标准id查询所有条目
ArrayList<TbStandardCatalogue> list=tbStandardCatalogueMapper.selectByStandardId(standardId);
if(list.isEmpty()){
return null;
}
//把结果集存入list
HashMap<String,TbStandardCatalogue> childs = new HashMap<>();
for (TbStandardCatalogue tbStandardCatalogue : list) {
//每条数据的id作为key
childs.put(tbStandardCatalogue.getId(),tbStandardCatalogue);
}
//开始套娃
for (TbStandardCatalogue tbStandardCatalogue : list) {
if(tbStandardCatalogue.getPid().equals(tbStandardCatalogue.getStandardId())){
//找到最顶层的父节点
result.add(tbStandardCatalogue);
}else{
//子节点自己去找父节点
TbStandardCatalogue catalogue = childs.get(tbStandardCatalogue.getPid());
if(catalogue!=null){
catalogue.getChild().add(tbStandardCatalogue);
}
}
}
return result;
}
备注:老师教的,留个记录