需求
碰到这样一个需求,根据部门查询出数据后动态的构建成树形结构,结果类似于这样
实体类和表结构
数据库表结构是这样的,关键用id和parentId来进行构建树结构
实体类是这样的,用红框的三个字段进行构建,children用来存每个节点的下一级子节点
过程
结构就是这样,于是网上简单看了下,发现网上的方法都是从上往下构建树,就是先给定一级节点id,然后递归去找所有节点的子节点,这样的话不符合我的需求,我的需求是动态构建,构建前是不知道一级节点是哪个的,一级节点可能有很多个,而且这方法复杂度到了n的平方,于是自己写了一个,我的方法是从下往上进行构建,每个节点只有一个父亲,我只要给所有节点找到它的父亲就行了,复杂度为n,代码如下,TblInstitutionType就是节点实体类,不用管名字。
//先查出数据 List<TblInstitutionType> types = tblInstitutionTypeMapper.selectTblInstitutionTypeList(tblInstitutionType); //用map存储,方便获取,降低复杂度 HashMap<Long,TblInstitutionType> typeHashMap = new HashMap<>(types.size()); //将所有节点加入到map中 types.forEach(type -> typeHashMap.put(type.getId(),type)); //遍历所有节点,寻找父节点并将子节点添加到父节点的孩子集合中 for (TblInstitutionType type : types) { Long parentId = type.getParentId(); if (typeHashMap.containsKey(parentId)){ typeHashMap.get(parentId).getChildren().add(type); } } //一级节点集合 List<TblInstitutionType> resultTypes = new ArrayList<>(); //将没有父节点的筛选出来,未找到父节点的说明是一级节点 for (TblInstitutionType type : types) { if (!typeHashMap.containsKey(type.getParentId())){ resultTypes.add(type); } } return resultTypes;