递归算法应用

获取完整的地区名称,包括上级省市。

输入:{regioncode=140121,regionname=清徐县}
输出:中国-山西-太原-清徐

/**
* 获取完整省市名称
* @param region{regioncode=140121,regionname=清徐县}
* @return 中国-山西-太原-清徐
*/
  private String getFullRegionName(Map region) {
      if(region.get("regioncode")==null) return "";
      String endRegionCode = "100000";//中国为结束节点
      if(endRegionCode.equals(region.get("regioncode"))){
          return (String) region.get("regionname");
      }else{
          Map parentRegion = mallDao.getParentRegion((String)region.get("regioncode"));//自己获取上级省市的代码
          return getFullRegionName(parentRegion)+"-"+region.get("regionname");
      }
  }

public static void main(String[] args) {
        CoalMallService instance = (CoalMallService) CoalMallService.getInstance();
        Map region = new HashMap();
        region.put("regioncode","140121");
        region.put("regionname","清徐县");
        String fullRegionName = instance.getFullRegionName(region);
        System.out.println(fullRegionName);
    }

获取树形数据

输入:140000 //山西
输出:[{
REGIONCODE=140100,
REGIONNAME=太原市,
isparent=true,
children=[{
REGIONCODE=140105,
REGIONNAME=小店区
},
{
REGIONCODE=140106,
REGIONNAME=迎泽区
},……

private List getFullChildRegions(String regionCode){
    List<Map> regions = mallDao.getRegions(regionCode);//根据上级地区编码获取下级地区列表
    if(CollectionUtils.isEmpty(regions)){
        return regions;
    }else{
        for(Map map:regions){
            List regions2 = getFullChildRegions((String) map.get("regioncode"));
            if(CollectionUtils.isNotEmpty(regions2)){
                map.put("isparent", true);
                map.put("children", regions2);
            }
        }
    }
    return regions;
}

public static void main(String[] args) {
        CoalMallService instance = (CoalMallService) CoalMallService.getInstance();
        List list = instance.getFullChildRegions("140000");
        System.out.println(list);
    }

另一个版本:获取完整的地区名称,包括上级省市

    /**
     * 获取完整省市名称
     * @param region {regioncode=141000,regionname=临汾市}
     * @return 中国 山西省 临汾市
     */
    private String getFullRegionName(Map region) {
        if(region.get("regioncode")==null) return "";
        String fullRegionName = (String) region.get("regionname");
        String rootRegionCode = "100000";
        Map parentRegion = mallDao.getParentRegion((String)region.get("regioncode"));
        if(parentRegion==null) return fullRegionName;
        if(rootRegionCode.equals(parentRegion.get("regioncode"))){
            fullRegionName = parentRegion.get("regionname")+" "+fullRegionName;
        }else{
            fullRegionName = getFullRegionName(parentRegion)+" "+fullRegionName;
        }
        return fullRegionName;
    }

这是重构getFullRegionName方法前的写法,是不成熟,没理解递归的写法。对比和重构后的写法,要注意的是:
1,首先理解递归出口。

if(endRegionCode.equals(region.get("regioncode"))){
      return (String) region.get("regionname");
}

2,根据递归出口,循环递归。

else{
    Map parentRegion = mallDao.getParentRegion((String)region.get("regioncode"));//自己获取上级省市的代码
    return getFullRegionName(parentRegion)+"-"+region.get("regionname");
}

参考资料:
递归算法
递归算法及经典递归例子代码实现

你可能感兴趣的:(web,算法)