第一次个人编程作业
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
· Planning | · 计划 | 20 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 600 | 1605 |
· Development | · 开发 | 60 | 240 |
· Analysis | · 需求分析 (包括学习新技术) | 180 | 900 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 10 | 15 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 10 | 15 |
· Coding | · 具体编码 | 30 | 120 |
· Code Review | · 代码复审 | 10 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
· Reporting Standard | · 报告 | 60 | 120 |
· Test Repor | · 测试报告 | 20 | 30 |
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
· | · 合计 | 600 | 1605 |
解题思路
1.首先分割电话号码,把电话号码提取出来。
2.分别分割姓名,地址。
3.将地址进行省市区等详细的划分。
4.将地址进一步区分道路,门牌号,详细地址。
~使用java的正则表达式来解析地址。
参考内容:https://blog.csdn.net/superSubfn/article/details/80290491
实现过程
类名 | 功能 |
FileIO | 文件输入输出 |
Trim | 处理信息 |
函数名 | 功能 |
void trimName() | 分割姓名 |
void trimDegree() | 分割等级 |
void trimPhoneNumber() | 分割电话号码 |
void trimAddress() | 分割地址(省市区) |
void trimDetail() | 分割详细地址 |
关键代码
利用正则表达式的规则来进行地址解析
String regex="(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
相对于参考的博客,加入了划分道路,门牌号,详细地址的功能。
String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)?(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县|.*?直辖市)?(?<county>[^县]+县|.+?区|.+县级市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇|.+街|.+乡)?(?<road>[^路]+街|.*?巷|.*?路)?(?<num>[^号]+门牌号|.*?号)?(?<village>.*)";
加入了解决直辖市问题的功能
try { if (province != null && province.charAt(province.length() - 1) == '市') {
city = province; province = province.replace("市", ""); } } catch (Exception e){ e.printStackTrace(); }
性能分析
单元测试
输入参数:
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建省福州市闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
控制台输出结果:
{"姓名":李四,"手机":13756899511,"地址":["福建省","福州市","鼓楼区","鼓西街","道湖滨路","110号","湖滨大厦一层"]}
{"姓名":张三,"手机":13599622362,"地址":["福建省","福州市","闽侯县","上街镇","福州大学10#111"]}
{"姓名":王五,"手机":18960221533,"地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]}
{"姓名":小陈,"手机":13965231525,"地址":["广东省","东莞市","","凤岗镇","凤平路13号"]}
异常处理
//文件输入异常 FileNotFindException: public static void main(String[] args) throws IOException //province可能为空 NullPointerException:
try { if (province != null && province.charAt(province.length() - 1) == '市') { ity = province; province = province.replace("市", ""); } } catch (Exception e) { e.printStackTrace(); }
问题
1.无法解决直辖市的省市区分割。
2.对于详细地址中带有省市区的分割不能正确处理。
3.无法解决没有带"省市区"等关键字的地址的分割。
4.无法对缺少的地址信息进行补全。