List集合封装成树形结构

本文介绍了如何使用JavaPojo实现区域编码数据的树状结构转换,包括定义RegionCodeVO类,封装成树形结构的方法以及排序算法。重点展示了如何通过递归和Map结构组织地区层级关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、定义java pojo

@Data
@ApiModel("区域编码VO")
public class RegionCodeVO implements Serializable {

    @ApiModelProperty("区域id")
    private Long id;

    @ApiModelProperty("行政区划代码")
    private String regionCode;

    @ApiModelProperty("行政区划名称")
    private String regionName;

    @ApiModelProperty("行政区划等级")
    private Integer regionLevel;

    @ApiModelProperty("上级行政区划代码")
    private String parentRegionCode;

    @ApiModelProperty("排序")
    private Integer order;

    @ApiModelProperty("下级区域列表")
    private List<RegionCodeVO> childList;
}

2、封装成树形结构

/**
     * 封装成树形结构
     * @param regionCodeVOS
     * @return
     */
    private List<RegionCodeVO> treeRegionCodeVOS(List<RegionCodeVO> regionCodeVOS) {
        //封装为树形结构
        List<RegionCodeVO> result = new ArrayList<>();
        if (!CollectionUtils.isEmpty(regionCodeVOS)) {
            RegionCodeVO root = new RegionCodeVO(); // 树的最顶级,没有任何的省市区内容
            Map<String, RegionCodeVO> regionCodeVOMap = regionCodeVOS.stream().collect(Collectors.toMap(RegionCodeVO::getRegionCode, Function.identity()));
            // 组装
            for (Map.Entry<String, RegionCodeVO> entry : regionCodeVOMap.entrySet()) {
                RegionCodeVO regionCodeVO = entry.getValue();
                if ("0".equals(regionCodeVO.getParentRegionCode())) { // 省、直辖市均默认parentCode为0
                    if(root.getChildList() == null) {
                        root.setChildList(new ArrayList<>());
                    }
                    root.getChildList().add(regionCodeVO); // 设置所有的省份、直辖市
                } else {
                    if (regionCodeVOMap.get(regionCodeVO.getParentRegionCode()).getChildList() == null) { // 获取当前对象对应的父对象下的子对象集合
                        regionCodeVOMap.get(regionCodeVO.getParentRegionCode()).setChildList(new ArrayList<>()); // 为空时,新创建一个子对象集合
                    }
                    regionCodeVOMap.get(regionCodeVO.getParentRegionCode()).getChildList().add(regionCodeVO); // 将当前对象添加到其父对象对应的子对象集合中
                }
            }
            // 排序
            sortRegionCode(root.getChildList());
            result = root.getChildList();
        }
        return result;
    }

3、排序

/**
     * 排序
     * @param regionCodeVOS
     * @return
     */
    private List<RegionCodeVO> sortRegionCode(List<RegionCodeVO> regionCodeVOS){
        if (CollectionUtils.isEmpty(regionCodeVOS)) {
            return regionCodeVOS;
        }
        if (regionCodeVOS.get(0).getRegionLevel() == 1) {
            sortByOrder(regionCodeVOS); // 省 - 按照order字段数字大小升序
        } else {
            sortByRegionName(regionCodeVOS); // 市、区 - 按照首字母升序
        }
        // 对每个节点的下一层节点进行排序
        for (RegionCodeVO regionCodeVO : regionCodeVOS) {
            sortRegionCode(regionCodeVO.getChildList());
        }
        return regionCodeVOS;
    }
    /**
     * 根据字段order排序
     * @param regionCodeVOS
     */
    private void sortByOrder(List<RegionCodeVO> regionCodeVOS) {
        Collections.sort(regionCodeVOS, new Comparator<RegionCodeVO>() {
            @Override
            public int compare(RegionCodeVO vo1, RegionCodeVO vo2) {
                int result = 0;
                Integer seq1 = vo1.getOrder();
                Integer seq2 = vo2.getOrder();

                if (seq1 != null && seq2 != null) {
                    result = seq1 < seq2 ? -1 : (seq1.equals(seq2) ? 0 : 1);
                } else {
                    result = vo1.getId() < vo2.getId() ? 1 : (vo1.getId().equals(vo2.getId()) ? 0 : -1);
                }
                return result;
            }
        });
    }
    /**
     * 根据名字首字母升序。java.text下的Collator工具排序不准。这里导入更准确的包
     * <!--中文拼音排序-->
        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <version>67.1</version>
        </dependency>
     * @param list
     * @return
     */
    private void sortByRegionName(List<RegionCodeVO> list){
        Comparator comparator = Collator.getInstance(ULocale.SIMPLIFIED_CHINESE);
        Collections.sort(list, (o1, o2) -> comparator.compare(o1.getRegionName(), o2.getRegionName()));
    }
    ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值