美文网首页
05-地址树转化

05-地址树转化

作者: 糖纸疯了 | 来源:发表于2021-11-22 11:38 被阅读0次

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":[

                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

5、课后习题

1)XXXX


相关文章

网友评论

      本文标题:05-地址树转化

      本文链接:https://www.haomeiwen.com/subject/opsdtrtx.html