1、写作背景
总想走捷径的人,往往因找不到捷径而固步自封,一步不前!
2、参考网址
3、学习目的
- 记录类似树的对象转化
4、核心操作
1)转化核心方法
/**
* 得到子节点列表(得到下级区域)
*/
public List<Region> buildAreaTree(List<Region> regions) {
List<Region> tree = new ArrayList<>();
for (Iterator<Region> it = regions.iterator(); it.hasNext(); ) {
Region region = it.next();
if (region.getPid() == 0) {
recursionFn(regions, region); //递归列表
tree.add(region);
}
}
return tree;
}
/**
* 递归列表
*/
private void recursionFn(List<Region> list, Region region) {
// 得到子节点列表
List<Region> childList = getChildList(list, region);
region.setChildren(childList);
for (Region child : childList) {
if (hasChild(list, child)) {
//判断是否有子节点
Iterator it = childList.iterator();
while (it.hasNext()) {
Region n = (Region) it.next();
recursionFn(list, n);
}
}
}
}
/**
* 得到子节点列表
*/
private List<Region> getChildList(List list, Region region) {
List<Region> tlist = new ArrayList();
Iterator<Region> it = list.iterator();
while (it.hasNext()) {
Region region1 = it.next();
if (region1.getPid().longValue() == region.getId().longValue()) {
tlist.add(region1);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<Region> list, Region region) {
return getChildList(list, region).size() > 0 ? true : false;
}
}
2)优化后的地址树
上面的树在使用的时候,需要遍历的次数太多了,我认为这样太损耗性能了,我自己写了一个简版的方法
/**
* 进行对象树转化(已经明确了要遍历的次数)
*/
public List<Region> buildAreaTree(List<Region> regions) {
// 获取第一级对象结构
List<Region> firstLevels = regions.stream().filter(item -> item.getPid() == 0).collect(Collectors.toList());
// 剩余的数据转化为Map
List<Region> firstLevelRemains = new ArrayList<>(CollectionUtils.subtract(regions, firstLevels));
Map<Integer, List<Region>> remainDataMap = firstLevelRemains.stream().collect(Collectors.groupingBy(Region::getPid));
// 进行对象树转化
List<Region> tree = getTreeDataInfo(firstLevels, remainDataMap);
return tree;
}
/**
* 进行对象树转化
*/
private List<Region> getTreeDataInfo(List<Region> firstLevels, Map<Integer, List<Region>> remainDataMap) {
List<Region> tree = new ArrayList<>();
for (Iterator<Region> it = firstLevels.iterator(); it.hasNext(); ) {
Region region = it.next();
// 设置第二级参数
List<Region> regions = remainDataMap.get(region.getId());
region.setChildren(regions);
// 设置第三级参数
if (CollectionUtils.isNotEmpty(regions)) {
for (int i = 0; i < regions.size(); i++) {
regions.get(i).setChildren(remainDataMap.get(regions.get(i).getId()));
}
}
tree.add(region);
}
return tree;
}
3)组装后的JSON样式
{
"msg":"操作成功",
"code":200,
"data":[
{
"id":1,
"name":"郑州",
"pid":0,
"sname":null,
"level":null,
"citycode":null,
"postcode":null,
"mername":null,
"lng":null,
"lat":null,
"pinyin":null,
"gmtCreate":"2021-11-18T03:55:15.000+00:00",
"gmtModified":"2021-11-18T03:55:15.000+00:00",
"status":"0",
"children":[
{
"id":2,
"name":"信阳",
"pid":1,
"sname":null,
"level":null,
"citycode":null,
"postcode":null,
"mername":null,
"lng":null,
"lat":null,
"pinyin":null,
"gmtCreate":"2021-11-18T03:42:24.000+00:00",
"gmtModified":"2021-11-18T03:42:24.000+00:00",
"status":"0",
"children":[
{
"id":3,
"name":"固始",
"pid":2,
"sname":null,
"level":null,
"citycode":null,
"postcode":null,
"mername":null,
"lng":null,
"lat":null,
"pinyin":null,
"gmtCreate":"2021-11-18T03:42:38.000+00:00",
"gmtModified":"2021-11-18T03:42:38.000+00:00",
"status":"0",
"children":[
]
},
{
"id":4,
"name":"商城",
"pid":2,
"sname":null,
"level":null,
"citycode":null,
"postcode":null,
"mername":null,
"lng":null,
"lat":null,
"pinyin":null,
"gmtCreate":"2021-11-18T03:42:52.000+00:00",
"gmtModified":"2021-11-18T03:42:52.000+00:00",
"status":"0",
"children":[
]
},
{
"id":5,
"name":"淮滨",
"pid":2,
"sname":null,
"level":null,
"citycode":null,
"postcode":null,
"mername":null,
"lng":null,
"lat":null,
"pinyin":null,
"gmtCreate":"2021-11-18T03:43:04.000+00:00",
"gmtModified":"2021-11-18T03:43:04.000+00:00",
"status":"0",
"children":[
]
}
]
}
]
}
]
}
网友评论