省县市三级分类

@Data
@ToString
public class DomesticRegionResp {
    private Integer codeId;    //ID
    private Integer parentId;  //父级ID
    private String cityName;  //名称
    private List<DomesticRegionResp> child;  //子级元素集合
}


    /**
     * @Description 省 -> 市 -> 县
     * 由于频繁请求数据库,取得全部省市县数据数据较慢,因此将数据全部取出交给JVM进行处理。
     * 于是进行三层封装数据处理。
     * 尝试一: 正常的数据过滤处理,最后执行打印语句时,出现堆栈溢出异常。
     * 尝试二:每次查询到一组数据后,在原List数组中删除已查询数据。这样实现查询次数的锐减。
     */
    @Test
    public void getProvinceInfo(){
        List<DomesticRegionResp> list = domesticRegionMapper.selectList(); //查出所有数据
        // 步骤一:获取省份或者直辖市,获取成功后删除获取到的信息 (第一级)
        List<DomesticRegionResp> provinceList = list.stream().filter(f -> f.getParentId() == 0)  //指出数据中所有id 等于fuid
                .collect(Collectors.toList());
        list.removeIf( f -> f.getParentId() == 0);

        // 步骤二: 根据省份获取市级或者区级信息 (第二级)
        for (DomesticRegionResp province : provinceList) {
            List<DomesticRegionResp> cityList = list.stream().filter(f -> f.getParentId().equals(province.getCodeId()))
                    .collect(Collectors.toList());
            list.removeIf( f -> f.getParentId().equals(province.getCodeId()));

            // 步骤三: 根据市级ID取得县信息或者区信息 (第三级)
            for (DomesticRegionResp city : cityList) {
                List<DomesticRegionResp> townList = list.stream().filter(f -> f.getParentId().equals(city.getCodeId()))
                        .collect(Collectors.toList());
                list.removeIf( f -> f.getParentId().equals(city.getCodeId()));
                //将县/镇放入 区/市行政区内
                city.setChild(townList);
            }
            province.setChild(cityList);
        }
        System.out.println(provinceList);
    }

循环方式


    /**
     * @Description 省 -> 市 -> 县
     * 由于频繁请求数据库,取得全部省市县数据数据较慢,因此将数据全部取出交给JVM进行处理。
     * 于是进行三层封装数据处理。
     * 尝试一: 正常的数据过滤处理,最后执行打印语句时,出现堆栈溢出异常。
     * 尝试二:每次查询到一组数据后,在原List数组中删除已查询数据。这样实现查询次数的锐减。
     * 尝试三:递归
     */
    @Test
    public void getProvinceInfo(){
        List<DomesticRegionResp> list = domesticRegionMapper.selectList();
        recursive(list);
    }
    /**
     * @Description 递归
     */
    public void recursive(List<DomesticRegionResp> list){
        long start = System.currentTimeMillis();
        //过滤出第一层
        List<DomesticRegionResp> first =
                list.stream().filter(region -> region.getParentId() == 0)
                .collect(Collectors.toList());
        list.removeIf( f -> f.getParentId() == 0);

        //第二三层递归 调用函数generateRegion 返回的集合封装到regin中
        first.forEach(region -> region.setChild(generateRegion(region.getCodeId(), list)));
        long end = System.currentTimeMillis();
        System.out.println("递归运行时间: " + (end - start));
    }

    //返回封装的集合
    public List<DomesticRegionResp> generateRegion(int parentId, List<DomesticRegionResp> list){
        return list.stream()
                .filter(region -> region.getParentId() == parentId)
                .peek(region -> region.setChild(generateRegion(region.getCodeId(), list)))
                .collect(Collectors.toList());
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值