1、新建树的类CatagaryTree。
public class CatagaryTree extends BaseEntity {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer parentID;
private String catagoryName;
private List<CatagaryTree> children = new ArrayList<>();
private Boolean isLeaf=false;
private String ancestors;
//针对前端调用需要,如果以上字段不足,可以在此补充
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setParentID(Integer parentID)
{
this.parentID = parentID;
}
public Integer getParentID()
{
return parentID;
}
public void setCatagoryName(String catagoryName)
{
this.catagoryName = catagoryName;
}
public String getCatagoryName()
{
return catagoryName;
}
public void setChildren(List<CatagaryTree> children)
{
this.children = children;
}
public List<CatagaryTree> getChildren()
{
return children;
}
public void setIsLeaf(Boolean isLeaf)
{
this.isLeaf = isLeaf;
}
public Boolean getIsLeaf()
{
return isLeaf;
}
}
2、获取与树相关的所有数据列表,包括数据来自于两个或多个表的情况,并将数据循环放入List<CatagaryTree>。我的数据来自于两个表。
public List<Map<String, Object>> querySubDataList(Map map){
List<Map<String, Object>> result = new LinkedList<>();
//(1)存储从数据库中获取的与树呈现相关的数据
List<SubCatagory> subCatagorys = subCatagoryMapper.querySubCatagoryList(map);
List<SubjectData> subjectDatas = subjectDataMapper.querySubDataByUserID(0);
List<CatagaryTree> resultList = new ArrayList<>();
//树中添加类型
for(SubCatagory subCatagory:subCatagorys){
CatagaryTree catagaryTree = new CatagaryTree();
catagaryTree.setDataID(subCatagory.getId());
catagaryTree.setParentID(subCatagory.getParentID());
catagaryTree.setCatagoryName(subCatagory.getName());
catagaryTree.setPrj(subCatagory.getPrj());
String[] str = subCatagory.getAncestors().split(",");
String resultStr = "";
if(subCatagory.getParentID()==0){
catagaryTree.setNodeID(String.format("%02d",subCatagory.getId()));
}else{
for(int i=0;i<str.length;i++){
int num = Integer.valueOf(str[i]);
if(num!=0){
resultStr+=String.format("%02d",num);
}
}
catagaryTree.setNodeID(resultStr+String.format("%02d",subCatagory.getId()));
}
catagaryTree.setDataType("类别");
resultList.add(catagaryTree);
}
//树中添加数据列表
for(SubjectData subjectData:subjectDatas){
CatagaryTree catagaryTree = new CatagaryTree();
catagaryTree.setDataID(subjectData.getId());
catagaryTree.setParentID(subjectData.getCatagoryID());
catagaryTree.setCatagoryName(subjectData.getLabel());
catagaryTree.setPrj(subjectData.getPrj());
catagaryTree.setStandard(subjectData.getStandard());//数据存在的字段
catagaryTree.setDataType("数据");
catagaryTree.setType(subjectData.getDataType());
resultList.add(catagaryTree);
}
//(2)获取树的所有节点
result = getChildInfo(0,resultList);
resultList=null;
return result;
}
2、根据List<CatagaryTree>元素的pID递归获取所有孩子节点,将具有父子结构关系的数据存入List<Map<String,Object>>,通过接口由前端调用。
public List<Map<String,Object>> getChildInfo(Integer pID,List<CatagaryTree> allList){
List<Map<String,Object>> childList = new LinkedList<>();//用于保存子节点的list
for(CatagaryTree catagaryTree:allList){
//如果是孩子,则附加到结果列表
//树由类别和数据两种情况
if(pID == catagaryTree.getParentID()&&catagaryTree.getDataType()=="类别"){
Map<String,Object> map = new LinkedHashMap<>();
map.put("id",catagaryTree.getDataID());
map.put("name",catagaryTree.getCatagoryName());
map.put("dataType",catagaryTree.getDataType());
map.put("isLeaf",true);
map.put("children",new Object[]{});
childList.add(map);//加入孩子节点
}
if(pID == catagaryTree.getParentID()&&catagaryTree.getDataType()=="数据"){
Map<String,Object> map = new LinkedHashMap<>();
map.put("id",catagaryTree.getDataID());
map.put("name",catagaryTree.getCatagoryName());
map.put("dataType",catagaryTree.getType());
map.put("isLeaf",true);
childList.add(map);//加入孩子节点
}
}
//遍历子节点,继续递归判断每个子节点是否还含有子节点
for(Map<String,Object> child:childList){
if(child.get("dataType")=="类别"){
List<Map<String,Object>> tList = getChildInfo(Integer.valueOf(String.valueOf(child.get("id"))), allList);
if(!tList.isEmpty()){
child.put("isLeaf",false);
}
child.put("children",tList);
}
}
return childList;
}