不使用递归形成组织树

组织结构一般是树形结构,很多情况下,会使用递归的方式来形成树形结构,其实对于组织这种数据量不大的数据来说,可以借助Map这种方式形成树形结构。

比如有如下这个组织表,有父ID,有自己的组织ID,

CREATE TABLE `zbh_custom_org` (
  `org_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '组织Id',
  `top_org_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '最上层组织ID',
  `parent_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '父组织Id',
  `custom_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '客户Id',
  `org_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '组织名称',
  PRIMARY KEY (`org_id`) USING BTREE
) 

 

第一步将所有符合条件的组织查询出来,

List<ZbhCustomOrg> orgs = this.findOrgListInner(params);

 

第二步是映射到另一个实体类中,这个实体类有一个List<TreeOrgVO> childrenList 存放子组织,

@Data
@ApiModel(value = "组织树形数据")
public class TreeOrgVO {
    @ApiModelProperty(value = "组织Id")
    private String orgId;
    
    @ApiModelProperty(value = "最上层组织Id")
    private String topOrgId;
    
    @ApiModelProperty(value = "父组织Id")
    private String parentId;
    
    @ApiModelProperty(value = "客户Id")
    private String customId;
    
    @ApiModelProperty(value = "组织名称")
    private String orgName;
    
    @ApiModelProperty(value = "下级组织列表")
    private List<TreeOrgVO> childrenList;
}

 

将数据映射到Map中,

Map<String, TreeOrgVO> map = orgs.stream()  // 转换为 Stream
                .collect(Collectors.toMap(new Function<ZbhCustomOrg, String>() {
                    @Override
                    public String apply(ZbhCustomOrg treeOrgVO) {
                        return treeOrgVO.getOrgId();
                    }
                }, new Function<ZbhCustomOrg, TreeOrgVO>() {
                    @Override
                    public TreeOrgVO apply(ZbhCustomOrg obj) {
                        TreeOrgVO treeOrgVO = new TreeOrgVO();
                        BeanUtils.copyProperties(obj,treeOrgVO);
                        treeOrgVO.setChildrenList(new ArrayList<>());
                        return treeOrgVO;
                    }
                }));

 

 

第三步,不断的从Map中获取数据,形成组织树,由于Java对List是指向型,也可以理解为指针类型,所以下面方式是可行的,

//需要从Map中移除的orgId
        Set<String> removeOrgIdSet = new HashSet<>();

        //组装成树形结构
        for (ZbhCustomOrg allDataRightOrg : orgs) {
            String orgId = allDataRightOrg.getOrgId();
            //顶级组织的parentId肯定是没有存在表中的
            String parentId = allDataRightOrg.getParentId();

            TreeOrgVO treeOrgVO = map.get(parentId);
            TreeOrgVO child = map.get(orgId);
            if(treeOrgVO==null||child==null) continue;

            removeOrgIdSet.add(orgId);
            treeOrgVO.getChildrenList().add(child);
        }

 

最后一步删除Map中其他非顶级组织,

for (String s : removeOrgIdSet) {
            map.remove(s);
        }

 

posted @ 2025-04-08 09:01  伟衙内  阅读(18)  评论(0)    收藏  举报