1 创建省市区的数据库
CREATE TABLE `m_area_code` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
`code` int(10) NOT NULL COMMENT '省份code',
`parent_code` int(10) NOT NULL DEFAULT 0 COMMENT '父级code',
`area_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `index_areacode_code`(`code`) USING BTREE,
INDEX `index_areacode_pcode`(`parent_code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4069 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '行政区划' ROW_FORMAT = Dynamic;
2 插入北京的数据
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (12, 110000, 0, '北京市', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (425, 110100, 110000, '北京市', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (814, 110101, 110100, '东城区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (815, 110102, 110100, '西城区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (816, 110105, 110100, '朝阳区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (817, 110106, 110100, '丰台区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (818, 110107, 110100, '石景山区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (819, 110108, 110100, '海淀区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (820, 110109, 110100, '门头沟区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (821, 110111, 110100, '房山区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (822, 110112, 110100, '通州区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (823, 110113, 110100, '顺义区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (824, 110114, 110100, '昌平区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (825, 110115, 110100, '大兴区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (826, 110116, 110100, '怀柔区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (827, 110117, 110100, '平谷区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (828, 110118, 110100, '密云区', NULL);
INSERT INTO `medical`.`m_area_code`(`id`, `code`, `parent_code`, `area_name`, `pinyin`) VALUES (829, 110119, 110100, '延庆区', NULL);
3 遍历数据
(方法一:比较耗时)
ListmAreaCodeList = mAreaCodeService.selectList();
ListoneLevelRegion = mAreaCodeList.stream().filter(item -> item.getParentCode() == 0).collect(Collectors.toList());
//遍历一级地区
oneLevelRegion.stream().forEach( oneItem ->
{
//获得二级地区 地级市、地区、自治州、盟
ListtwoLevelRegion = mAreaCodeList.stream().filter(twoItem ->
StringUtils.equals(String.valueOf(twoItem.getParentCode()),String.valueOf(oneItem.getCode())))
.collect(Collectors.toList());
//遍历二级地区
twoLevelRegion.stream().forEach( twoItem ->
{
//获得三级地区 市辖区、县级市、县
ListthreeLevelRegion = mAreaCodeList.stream().filter(threeItem ->
StringUtils.equals(String.valueOf(threeItem.getParentCode()) , String.valueOf(twoItem.getCode())))
.collect(Collectors.toList());
twoItem.setMAreaCodeList(threeLevelRegion);
});
oneItem.setMAreaCodeList(twoLevelRegion);
}
);
result.setData(oneLevelRegion);
(方法二:耗时比较短)
ListmAreaCodeList2 = mAreaCodeService.selectList();
ListresultList = new ArrayList<>(32);
MapareaMap = new HashMap<>(mAreaCodeList2.size());
mAreaCodeList2.forEach(area ->{
MAreaCodeVo vo = areaMap.get(area.getId());
if(vo==null){
vo= new MAreaCodeVo();
vo.setMAreaCodeList(new ArrayList<>());
areaMap.put(area.getCode(),vo);
}
vo.setId(area.getId());
vo.setCode(area.getCode());
vo.setAreaName(area.getAreaName());
vo.setParentCode(area.getParentCode());
Integer parentId = area.getParentCode();
if(parentId >0){
MAreaCodeVo parentVo = areaMap.get(parentId);
if(Objects.isNull(parentVo)){
parentVo = new MAreaCodeVo();
parentVo.setId(parentId);
parentVo.setMAreaCodeList(new ArrayList<>());
areaMap.put(vo.getId(),parentVo);
}
parentVo.getMAreaCodeList().add(vo);
}else{
resultList.add(vo);
}
});
result.setData(resultList);
4 返回的数据
{
"id": 12,
"code": 110000,
"parentCode": 0,
"areaName": "北京市",
"pinyin": null,
"mareaCodeList": [
{
"id": 425,
"code": 110100,
"parentCode": 110000,
"areaName": "北京市",
"pinyin": null,
"mareaCodeList": [
{
"id": 814,
"code": 110101,
"parentCode": 110100,
"areaName": "东城区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 815,
"code": 110102,
"parentCode": 110100,
"areaName": "西城区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 816,
"code": 110105,
"parentCode": 110100,
"areaName": "朝阳区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 817,
"code": 110106,
"parentCode": 110100,
"areaName": "丰台区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 818,
"code": 110107,
"parentCode": 110100,
"areaName": "石景山区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 819,
"code": 110108,
"parentCode": 110100,
"areaName": "海淀区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 820,
"code": 110109,
"parentCode": 110100,
"areaName": "门头沟区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 821,
"code": 110111,
"parentCode": 110100,
"areaName": "房山区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 822,
"code": 110112,
"parentCode": 110100,
"areaName": "通州区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 823,
"code": 110113,
"parentCode": 110100,
"areaName": "顺义区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 824,
"code": 110114,
"parentCode": 110100,
"areaName": "昌平区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 825,
"code": 110115,
"parentCode": 110100,
"areaName": "大兴区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 826,
"code": 110116,
"parentCode": 110100,
"areaName": "怀柔区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 827,
"code": 110117,
"parentCode": 110100,
"areaName": "平谷区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 828,
"code": 110118,
"parentCode": 110100,
"areaName": "密云区",
"pinyin": null,
"mareaCodeList": null
},
{
"id": 829,
"code": 110119,
"parentCode": 110100,
"areaName": "延庆区",
"pinyin": null,
"mareaCodeList": null
}
]
}
]
}