PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 120 | 100 |
Analysis | 需求分析 (包括学习新技术) | 120 | 180 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 30 | 45 |
Coding Standard | 代码规范(为开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 120 | 180 |
Coding | 具体编码 | 750 | 900 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 40 | 60 |
Test Repor | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 20 | 25 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 30 |
Total | 总计 | 1540 | 1915 |
计算模块接口的设计与实现过程
-
用到的工具类
类名 作用 Utils 1.获取url连接,将返回的文本保存下来;2.将double类型数据保留到小数点后六位 -
主要函数
public static Map nameAndNumberResolution(String string)
该函数用于分离出字符串中的名字、电话还有未分离的地址。
地址的分离需要调用以下函数
public static ArrayList getAdd(int flag,String address)
其中前三级地址是通过调用百度地图的api获得的(但是及其容易出问题,而且一天只能查询6000次,所以在提交的时候特别后悔自己怎么想出了这个方法)。
这个调用是这样的:首先把不完整的地址提交给百度地图,然后获得该地址对应的经度和纬度(函数声明如下)
public static Map getLngAndLat(String address)
然后把经度和纬度通过百度地图的api(如下所示)获得出完整的前三级地址的json格式。
Map map=getLngAndLat(address);
double lat=0;
double lng=0;
if(map.containsKey("lat"))
lat=(double)map.get("lat");//纬度
if(map.containsKey("lng"))
lng=(double)map.get("lng");//经度
String url="http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location="+lat+","+lng+"&output=json&pois=1&ak=859d16285fd000feec89e9032513f8bb";
String string = Utils.loadJSON(url);
string=string.substring(29,string.length()-1);//去除renderReverse&&renderReverse()
JSONObject obj = JSONObject.fromObject(string);
然后是“街道/镇/乡”这一级,我是通过正则匹配进行的
Pattern pattern = Pattern.compile("(.+?镇|.+?街道|.+?乡|.+?民族乡|.+?县辖区)[.+街|.+巷|.+路|.+胡同|.+道|.+弄|.+坊|.+里|.+市]*");
如果是难度2的话,道路名、门牌号等也是通过正则匹配进行
Pattern pattern1 = Pattern.compile("(.+街|.+巷|.+路|.+胡同|.+道|.+弄|.+坊|.+里|.+市)([1-9][0-9]*号)");
计算模块接口部分的性能改进。
计算模块部分单元测试展示
单元测试
![](https://img2018.cnblogs.com/blog/1331849/201909/1331849-20190930232703932-812244264.jpg)
![](https://img2018.cnblogs.com/blog/1331849/201909/1331849-20190930232802353-1922638811.png)
![](https://img2018.cnblogs.com/blog/1331849/201909/1331849-20190930232819621-1193749133.png)
![](https://img2018.cnblogs.com/blog/1331849/201909/1331849-20190930232844768-1023342406.png)
计算模块部分异常处理说明
-
首先是"1!张三,福建福州闽13599622362侯县上街镇福州大学10#111."这个例子。
因为百度识别不出"10#111",所以返回"未找到相匹配的经纬度!",然后结果会变成
{"姓名":"张三","手机":"13599622362","地址":["","","","福建福州闽侯县上街镇","福州大学10#111"]}
所以这里要对字符串进行处理
Pattern pattern = Pattern.compile("([0-9]*#[0-9]*)");//先把10#111这些字符剔除 Matcher matcher=pattern.matcher(address); if(matcher.find()){ address=address.replace(matcher.group(),""); }
结果:
{"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇","福州大学10#111"]}
-
然后是"2!牛多搓,广西壮族自治区15029285452来宾金秀瑶族自治县六巷乡六巷街1号六巷乡人民政府."
这里使用了正则
Pattern pattern = Pattern.compile("(.+?镇|.+?街道|.+?乡|.+?民族乡|.+?县辖区)[.+街|.+巷|.+路|.+胡同|.+道|.+弄|.+坊|.+里|.+市]*");
结果:
{"姓名":"牛多搓","手机":"15029285452","地址":["广西壮族自治区","来宾市","金秀瑶族自治县","六巷乡","六巷街","1号","六巷乡人民政府"]}
可以说是准确度挺高的
-
还有针对像东莞市这样不设市辖区的地级市
直接特判
district=""; if(!city.equals("东莞市")&&!city.equals("中山市")&&!city.equals("三沙市")&&!city.equals("儋州市")&&!city.equals("嘉峪关市")) { district=obj.getJSONObject("result").getJSONObject("addressComponent").getString("district"); }
然后"区/县/县级市"这一级就为空了
-
当然还有解决不了的
"1!涂晓蹂,吉林省长春市长春高新技术产业开发区高新开发区102国道以北规划富裕河14781957580以南长春恒大名都131号香得益彰麻辣居."
这个百度地图真的找不到……
结果:
{"姓名":"涂晓蹂","手机":"14781957580","地址":["","","","","吉林省长春市长春高新技术产业开发区高新开发区102国道以北规划富裕河以南长春恒大名都131号香得益彰麻辣居"]}
还有这个
"1!花光,河北承德市承德高13926614771新技术产业开发区上板城镇高新技术开发区白河南村河北建投承德热电股份有限公司."
结果:
{"姓名":"花光","手机":"13926614771","地址":["","","","河北承德市承德高新技术产业开发区上板城镇","高新技术开发区白河南村河北建投承德热电股份有限公司"]}
总结
1.关于百度地图的api还是少用为好,因为它每个ak码限制了访问次数,每天只能访问6000次,对此我表示很无奈。感觉高德地图应该会好一些。
2.java的测评也搞了半天,浪费了很多时间,真的是太难了。
3.搞到最后还是有很多问题,只能先交了再慢慢改了。
4.因为时间有点赶,还有很多东西没学会,之后有时间补上吧。