第一次个人编程作业
一、CTJM的GitHub项目地址
二、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 50 | 60 |
| Estimate | 估计这个任务需要多少时间 | 1225 | 1495 |
| Development | 开发 | 240 | 260 |
| Analysis | 需求分析 (包括学习新技术) | 80 | 90 |
| Design Spec | 生成设计文档 | 90 | 100 |
| Design Review | 设计复审 | 50 | 60 |
| Coding Standard | 代码规范(为开发制定合适的规范) | 40 | 60 |
| ·Design | 具体设计 | 100 | 130 |
| · Coding | 具体编码 | 240 | 300 |
| Code Review | · 代码复审 | 30 | 40 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 150 | 200 |
| Reporting | 报告 | 40 | 50 |
| · Test Repor | · 测试报告 | 50 | 60 |
| Size Measurement | 计算工作量 | 20 | 25 |
| Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 45 | 60 |
| . | · 合计 | 1225 | 1495 |
三、解题思路描述
- “!”前面是此次地址需要改的级别,先将它分离出来。
- “,”前面为姓名,分离姓名
- 分离电话号码,我在网上查找了资料,用了正则表达式分离号码。(参考了以下资料但没有直接套用)
- 手机号正则表达式参考链接:
- 正则表达式参考链接:
- ps:
原来想将地址分级用正则表达式做出来,也找了许多资料,但由于自己之前对Java的了解不够深,且自己比较笨,所以只研究出来了号码使用正则表达式切割的正确方法,地址的分级由于用正则我较多实现不了,所以只能使用较为简单的方法。这次作业做完有点艰难,之后我一定会加强对Java和正则表达式的学习。
- 地址的分级用了一个有中国大陆的省市区/县三级地址的包(由于不会接入API,用了比较笨的方法),不缺省市区时就直接比对 ,比对成功则把它们分别赋值给我的省市区变量。在省市区以下,则直接匹配关键字镇等。由于三级地址xml文件里有些城市缺少或级别错误,所以还稍微修改了一下。
四、计算模块接口的设计与实现过程
- 主要类和函数
| 类名 | 主函数名 | 功能 |
|---|---|---|
| Test | void main(String[] args) | 主函数,实现调用各种类和文件的输入输出 |
| String printjson(int k) | 实现json格式 | |
| XM | void xmcl() | 分离难度级别和姓名,还有将地址等信息返回 |
| Num | String quhao() | 根据正则表达式将号码分离 |
| Address | void provinces() | 将省比对分离 |
| void citys() | 将市比对分离 | |
| void areas() | 将县/区比对分离 |
-
流程图

-
算法关键
- 用正则分离号码
- 导入xml文件以便分离省市区/县
- 文件按行读入,按行输出
-
单元测试
[{"姓名":"李四","手机":"13756899511","地址":["福建省","","鼓楼区","鼓西街道","湖滨路110号湖滨大厦一层"]},
{"姓名":"张三","手机":"13599622362","地址":["","福州市","闽侯县","上街镇","福州大学10#111"]},
{"姓名":"刘湖","手机":"18694520738","地址":["吉林省","白山市","","六道江镇","西村药店"]},
{"姓名":"咸陡隐","手机":"13184142847","地址":["江苏省","苏州市","吴江区","平望镇","新业织造有限公司吴江区平望镇双浜村村民委员会"]},
{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]},
{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]},
{"姓名":"王五","手机":"18694520738","地址":["云南省","昭通市","水富县","","云川路","1号",""]},
{"姓名":"王五","手机":"18694520738","地址":["四川省","眉山市","仁寿县","黑龙滩镇","牌坊街","",""]},
{"姓名":"王五","手机":"18694520738","地址":["陕西省","渭南市","韩城市","","","","108国道附近"]},
{"姓名":"杭寥屎","手机":"13012362387","地址":["天津","天津市","滨海新区","","黄圈村村委会"]},
{"姓名":"太叔哎","手机":"18761609305","地址":["河北省","邯郸市","邯郸冀南新区","西光禄镇","冀南新区光录镇尧丰村三组203号宏科劳保手套厂"]}]
五、改进
-
代码初版存在直辖市显示错误问题,后来当出现直辖市是将市等于省,并将xml文件改良
-
用多个例子后发现出现了缺省时市出不来及缺省市时县出不来等问题,改进为当出现前面问题时,比对xml文件里省市县等的前两字,符合即可输出 ;
-
之间出现了了由于详细地址或者下级地址里出现省市相关字眼被分离出来单独成为一级的问题,解决方法为用sub使遍历时只分离碰到的第一个省市字眼成为单独的一级
-
性能分析图

-
覆盖率

六、代码说明
public String quhao() {
Pattern pattern = Pattern.compile("([1][3-9][\\d]{9})|(0\\d{2,4}-\\d{7,8})"); //号码的正则表达式
Matcher matcher = pattern.matcher(adr);
StringBuffer bf = new StringBuffer(64);
while (matcher.find()) {
bf.append(matcher.group());
}
String[] strlist = adr.split(bf.toString()); //遍历所有,和号码一样的分离出来
adr=strlist[0]+strlist[1];
f
for(;i<address.length();i++){
if(address.charAt(i)=='省'){
ok=true;
break;
}
}
if(ok==true){ //如果有找到省这个字,进行直接分离,否则进行下一个分离。
province = address.substring(0,i);
address = address.substring(i+1);
}else{
boolean find = false;
LocalUtil lu = new LocalUtil (); //没找到省字,遍历xml文件中的省,符合则赋给变量
List<String> list = lu.getProvinces("中国");
String[] strlist={""};
for(i=0; i<list.size(); i++){
strlist =address.split(list.get(i),2); //只分离第一个出现省市等关键词单独为级
if(strlist[0].equals(address)){
}else{
find=true;
break;
}
}
if(find==true){
province=list.get(i);
address=strlist[1];
}else {
province="";
}
}
}
七、计算模块部分异常处理说明
- 文件输出原来用filewriter,改成utf-8格式时会乱码,后来改成了OutputStreamWriter(fileOutputStream,StandardCharsets.UTF_8),将输出文件改成utf-8格式为正常。
- 遇到缺省有市,缺省市有县等问题时解决不了,后来将xml改良且将方法改为对比xml文件,前两字符合则赋值给变量。
八、心路历程与收获
- 谢谢老师给我学习地理的机会,我真的很开心
- 此次加深了对Java的学习,之前项目经验较少,这次是个挺不错的锻炼机会,虽然是个小项目,但是通过这个小项目体会到了不断找bug,不断搜集资料,不断改进代码的过程。收获了更会自己百度的能力和更熟悉了Java。
- 这次用的是没有调用api的方法,实在是太麻烦了,我要继续努力,学会怎么用api,向大佬看齐,群里的大佬太多了,流下了没有技术的泪水。
- 一开始做这个项目的时候架构不够好,导致了很多麻烦,以后要把各种类和方法规范化,好改好调用。
- 通过这次作业,意识到了自己的算法垃圾,要加强学习。

浙公网安备 33010602011771号