第一次个人编程作业

一、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

三、解题思路描述

  • “!”前面是此次地址需要改的级别,先将它分离出来。
  • “,”前面为姓名,分离姓名
  • 分离电话号码,我在网上查找了资料,用了正则表达式分离号码。(参考了以下资料但没有直接套用)
    • 手机号正则表达式参考链接:
      • java的字符串中获取手机号码
      • java使用正则识别及获取字符串中的手机号、及座机号(格式正确即可)。
      • java后台地址(省,市,区)、姓名、手机号算法智能识别
    • 正则表达式参考链接:
      • 读懂正则表达式就这么简单
    • 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() 将县/区比对分离
  • 流程图
    第一次个人编程作业_第1张图片

  • 算法关键
    • 用正则分离号码
    • 导入xml文件以便分离省市区/县
    • 文件按行读入,按行输出
  • 单元测试
[{"姓名":"李四","手机":"13756899511","地址":["福建省","","鼓楼区","鼓西街道","湖滨路110号湖滨大厦一层"]},
{"姓名":"张三","手机":"13599622362","地址":["","福州市","闽侯县","上街镇","福州大学10#111"]},
{"姓名":"刘湖","手机":"18694520738","地址":["吉林省","白山市","","六道江镇","西村药店"]},
{"姓名":"咸陡隐","手机":"13184142847","地址":["江苏省","苏州市","吴江区","平望镇","新业织造有限公司吴江区平望镇双浜村村民委员会"]},
{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]},
{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]},
{"姓名":"王五","手机":"18694520738","地址":["云南省","昭通市","水富县","","云川路","1号",""]},
{"姓名":"王五","手机":"18694520738","地址":["四川省","眉山市","仁寿县","黑龙滩镇","牌坊街","",""]},
{"姓名":"王五","手机":"18694520738","地址":["陕西省","渭南市","韩城市","","","","108国道附近"]},
{"姓名":"杭寥屎","手机":"13012362387","地址":["天津","天津市","滨海新区","","黄圈村村委会"]},
{"姓名":"太叔哎","手机":"18761609305","地址":["河北省","邯郸市","邯郸冀南新区","西光禄镇","冀南新区光录镇尧丰村三组203号宏科劳保手套厂"]}]

五、改进

  • 代码初版存在直辖市显示错误问题,后来当出现直辖市是将市等于省,并将xml文件改良
  • 用多个例子后发现出现了缺省时市出不来及缺省市时县出不来等问题,改进为当出现前面问题时,比对xml文件里省市县等的前两字,符合即可输出 ;
  • 之间出现了了由于详细地址或者下级地址里出现省市相关字眼被分离出来单独成为一级的问题,解决方法为用sub使遍历时只分离碰到的第一个省市字眼成为单独的一级
  • 性能分析图
    第一次个人编程作业_第2张图片

  • 覆盖率
    第一次个人编程作业_第3张图片

六、代码说明

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 list =     lu.getProvinces("中国");
                String[] strlist={""};
                for(i=0; i

七、计算模块部分异常处理说明

  • 文件输出原来用filewriter,改成utf-8格式时会乱码,后来改成了OutputStreamWriter(fileOutputStream,StandardCharsets.UTF_8),将输出文件改成utf-8格式为正常。
  • 遇到缺省有市,缺省市有县等问题时解决不了,后来将xml改良且将方法改为对比xml文件,前两字符合则赋值给变量。

八、心路历程与收获

  • 谢谢老师给我学习地理的机会,我真的很开心
  • 此次加深了对Java的学习,之前项目经验较少,这次是个挺不错的锻炼机会,虽然是个小项目,但是通过这个小项目体会到了不断找bug,不断搜集资料,不断改进代码的过程。收获了更会自己百度的能力和更熟悉了Java。
  • 这次用的是没有调用api的方法,实在是太麻烦了,我要继续努力,学会怎么用api,向大佬看齐,群里的大佬太多了,流下了没有技术的泪水。
  • 一开始做这个项目的时候架构不够好,导致了很多麻烦,以后要把各种类和方法规范化,好改好调用。
  • 通过这次作业,意识到了自己的算法垃圾,要加强学习。

你可能感兴趣的:(第一次个人编程作业)