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()));
}
```