前言
again, 公司一项目需要中国城市-地区的行政划分表
从网上搜得数据库如下:全国省份城市access版本数据库
转换到我们自己定义的数据库中
Action
db design
将三张表(province, city, area)直接合并成一张表
district_def
| id | district_id | name | parent_district_id|
Data Import
从access表中导入到mysql,使用java 程序
第一步:set up access odbc driver
startup -> 控制面板 control panel -> 管理工具 manage tool -> 数据源
添加 系统dns(或者用户dns) -> MS Access Database
-> Driver for *.mdb
第二步:java code , jdbc-odbc driver
有两点注意 即可
-
driver使用 jdbcOdbc: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
-
连接url格式为:jdbc:odbc:<NAME> name是第一步建立的odbc源名称
树的压扁
使用上述数据库,主要是为了根据城市名称得到其行政区,比如上海,得到徐汇区,浦东新区,长宁区,黄浦区,。。。。
但我们发现中国的行政划分有一些中间分层,比如上海,直接下属是行政编号为310100(市辖区), 310200(县)的两个中间单位.
Shanghai
|__ 市辖区
|___ 徐汇区
|___ 浦东新区
|___ ...
|__ 县
|___ 崇明县
于是,我们使用递归将这些中间单位从树中去掉
Shanghai
|___ 徐汇区
|___ 浦东新区
|___ ...
|___ 崇明县
- districtCache 为[行政编号, District] 的map,声明为Map<Integer, DistrictBO> districtCache
- 为什么不使用 树的前序与后序遍历 (Pre-order Post-order Traversal) 中的通用遍历NodeVisitor? 树的压缩仅仅发生一次,无性能考虑,使用递归方便简单。