List集合封装成树形结构

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 treeRegionCodeVOS(List regionCodeVOS) {
//封装为树形结构
List 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 sortRegionCode(List 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()));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值