1.github地址
2.PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
| Planning | · 计划 | 10 | 20 |
| · Estimate | · 估计这个任务需要多少时间 | 10 | 20 |
| Development | · 开发 | 440 | 855 |
| · Analysis | · 需求分析 (包括学习新技术) | 180 | 240 |
| · Design Spec | · 生成设计文档 | 20 | 20 |
| · Design Review | · 设计复审 | 10 | 10 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
| · Design | · 具体设计 | 20 | 25 |
| · Coding | · 具体编码 | 180 | 350 |
| · Code Review | · 代码复审 | 20 | 15 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 30 | 180 |
| Reporting | · 报告 | 70 | 70 |
| · Test Report | · 测试报告 | 30 | 30 |
| · Size Measurement | · 计算工作量 | 10 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| · 合计 | 520 | 945 |
3.计算模块接口的设计与实现过程
- 信息收集
- 收集中国所有省份信息
- 收集中国所有地级市信息
- 解题思路
- 电话号码最碍事,先把电话号码取出来,然后删除电话号码,把剩下的内容合并成一个字符串
- 利用名字后的逗号作为标识符取出姓名,然后删除姓名和逗号,剩下的内容成为一个新的字符串
- 在字符串中搜索省份信息,取出省份后把省份删除,剩下的内容成为一个新的字符串
- 获取地级市的方法同上
- 其他等级的地址信息用“乡”、“镇”、“县”、“街道”、“号”等关键词查找,找到后就取出再删除,如果没有就认为这一级缺省
- 将提取出的各级信息按照要求格式输出
- 附加题不做
- 需要学习的技能
- java语言
- 重点学习java的字符串处理方法
- java文件输入输出方法
- GitHub的使用
代码一共两个类,一个是Main类,另一个是Citysearch类。Main类中只有一个方法也就是main方法,标志着程序执行的起点。main方法的主要职能就是读取文件,处理文件内容,然后输出到文件。Citysearch类是一个静态类,这样就可以直接使用类名调用它的方法,Citysearch类主要用来存储省份信息和地级市信息、提供Fivelevel()方法将损坏的地址信息划分成五级地址、提供Addressfix()类可根据要求将地址信息划分为五级或七级,其中Fivelevel()方法只为Addressfix()方法提供服务。其余的方法就是为这两个方法的实现提供服务。下图是Citysearch类的所有方法,其功能在注释中都有说明,由于代码过长所以详细代码都已经折叠。
下面以如何获取提取姓名、电话号码和省份信息为例解释编码思路
//总的思路就是先利用逗号为标志符把姓名提取出来,然后把剩下部分成为一个新的字符串,再用正则表达式把手机号提取出来,剩下的部分成为一个新的字符串,然后再查找省份,提取省份,剩下的部分再成为一个字符串,以此类推。前两级的地址获取方法是通过在预先准备好的数组中查找,后面五级的地址就是通过“县”、“乡”、“镇”、“路”等关键词来查找。 private static int MatchProvince(String str){ for(int i=0;i<MyProvince.length;i++){ if(str.contains(MyProvince[i])) return i; } return -1; }//这个方法用于查找地址中的省份信息,如果找到某一个省份,就返回该省份在Province数组中的下标 private static String[] Fivelevel(String str){ String NewAddress[] = new String[10];//用于存储划分出来的各项信息 str=str.substring(2,str.length());//将难度标志去除,剩下部分成为一个新的字符串 String[] firstArray=str.split(",",2);//将姓名与其他信息分隔 NewAddress[0]=firstArray[0];//将姓名信息存入数组 str=firstArray[1];//获得去除姓名后的字符串 int location;//记录关键信息在信息数组中的位置 int flag1;//记录关键信息在字符串中的位置 String regex="\\d{11}";//手机号正则表达式 Pattern pattern = Pattern.compile(regex); // 创建匹配给定输入与此模式的匹配器。 Matcher matcher = pattern.matcher(str); //查找字符串中是否有符合的子字符串 while(matcher.find()){ //查找到符合的即输出 NewAddress[1]=matcher.group();//获取手机号 } firstArray=str.split(regex,2);//以手机号为标志分隔字符串 str=firstArray[0]+firstArray[1];//得到去除手机号后的字符串 /*提取省份信息后删除省份信息*/ location=MatchProvince(str); if(location==-1) { NewAddress[2]="";//如果没有找到省份就认为省份缺省 } else { NewAddress[2]=MyProvince[location];//将省份信息存入数组 flag1=str.indexOf(MyProvince[location]); if(location!=1 && location!=2 && location!=0 && location!=3){//如果这个省份不是直辖市 NewAddress[2]=MyProvince[location]+"省";//由于省份数组里所有的省都是没有带“省”后缀的,这里补上 if(str.substring(flag1,flag1+MyProvince[location].length()+1).equals(NewAddress[2])){ str=str.substring(flag1+MyProvince[location].length()+1,str.length());//如果地址里的省份没有带“省”后缀的分割方法 } else{ str=str.substring(flag1+MyProvince[location].length(),str.length());//如果地址里的省份有带“省”后缀的分割方法 } } else{ str=str.substring(flag1+MyProvince[location].length(),str.length()); } } //剩下的代码就是获取其他等级地址信息,由于过长这里就没有放出来 }4.计算模块接口部分的性能改进。
性能分析图


安装和学习使用Jprofiler就花了好大功夫,结果这个性能分析图跑出来的结果我也是一脸懵逼,图里面就没有看到哪一个是我写的方法,所以我就姑且认为我的代码消耗最大的方法是byte[]吧!因为这个性能分析图也没能帮上我的忙,所以代码改进也都是凭自己之前的编程经验去做,主要就是想出更多的特殊情况然后在代码里加入应对这些特殊情况的逻辑吧。5.计算模块部分单元测试展示。
蓝瘦,看了邹欣老师的博客也没弄明白单元测试怎么做。
6.计算模块部分异常处理说明。
异常处理就是在Main方法的“读取文件、处理文件、输出文件”代码段使用了IOexception。由于对于自定义异常的使用还不太熟悉,所以在代码其他地方就都使用条件判断逻辑避免特殊情况发生来代替异常。

--------------------------------------------------------这是两张图片,我是分隔线------------------------------------------------------------------------------
7.心路历程与收获
初见题目觉得不算太难,真正开始做的时候发现事情不太对劲,无论是代码功能的实现还是博客撰写的要求对我来说都很不友好,甚至遇到了大量的知识盲区,花费了大量时间去查找和学习新知识新技能,到头来好像也都只是一知半解,真的是菜的一败涂地,这次作业给我最大的收获或许不是我学到了什么新知识新技能,而是告诉我没事的时候多学一点课外的专业知识。




