zoukankan      html  css  js  c++  java
  • 第一次个人编程作业

    个人仓库

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    · Planning · 计划 60 30
    · Estimate · 估计这个任务需要多少时间 10 10
    · Development · 开发 180 300
    · Analysis · 需求分析 (包括学习新技术) 80 50
    · Design Spec · 生成设计文档 90 60
    · Design Review · 设计复审 90 60
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 10
    · Design · 具体设计 60 60
    · Coding · 具体编码 180 180
    · Code Review · 代码复审 90 180
    · Test · 测试(自我测试,修改代码,提交修改) 120 480
    · Reporting Standard · 报告 60 60
    · Test Repor · 测试报告 60 60
    · Size Measurement · 计算工作量 20 20
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 60
    · · 合计 1190 1620

    解题思路

    1. 由于数据只有手机号被混到地址中,所以先切出手机号
    2. 然后切除名字方便解析地址
    3. 地址解析部分用正则表达式
      • 解析用到的正则表达式参考博客[1]

    关键代码

    String regex="(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
    
    

    输入输出样例

    //传入参数
    System.out.println(AddressUtil.addressResolutionVersion1("李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层"));
    System.out.println(AddressUtil.addressResolutionVersion1("张三,福建省福州市闽13599622362侯县上街镇福州大学10#111"));
    System.out.println(AddressUtil.addressResolutionVersion1("王五,福建省福州市鼓楼18960221533区123号福州鼓楼医院"));
    System.out.println(AddressUtil.addressResolutionVersion1("小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院"));
    System.out.println(AddressUtil.addressResolutionVersion1("小陈,广东省东莞市凤岗13965231525镇凤平路13号"));
    
    //控制台打印结果
    {"姓名":"李四","手机":"13756899511","地址":["福建省","福州市","鼓楼区","","鼓西街道湖滨路110号湖滨大厦一层"]}
    {"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇","福州大学10#111"]}
    {"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","123号福州鼓楼医院"]}
    {"姓名":"小美","手机":"15822153326","地址":["北京市","东城区交道口东大街1号北京市","东城区","","人民法院"]}
    {"姓名":"小陈","手机":"13965231525","地址":["广东省","东莞市","","凤岗镇","凤平路13号"]}
    

    发现和范例给的要求还是有区别的

    分析问题

    • 直辖市和一般城市没有做区别
    • town部分没有匹配街道
    • 没有采用"非贪婪"的表达式

    修改后的正则表达式

    String regex="(?<province>[^省]+自治区|.*?省|.*?行政区)?(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)?(?<county>[^县]+县|.+?区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇|.+街道)?(?<village>.*)";
    

    后来在测试过程中发现测试数据存在省市区关键字缺失的情况,因此不能采用上面的方法。我裂开了

    修正后的思路

    1. 手机号,名字的处理方法不变
    2. 加载行政区数据匹配字符串的前3级
      • 从最前的字符遍历的输入字符,与数据中的行政区一一比较
    3. 后面的级别同样通过正则表达式

    主要类和方法

    类名 方法名 功能
    AreaCodeConvert void Convert() 读取行政区数据文件加载到内存中
    AddressUtil void addressResolutionVersion2(String address) 解析地址(V1已经废弃)
    - String getProvince(String address) 解析省级
    - String getCity(String address) 解析市级
    - String getCityWithoutProvince(String address) 省缺失解析市级
    - String getCounty(String address) 解析县级
    - String getCountyWithoutProvinceAndCity(String address) 省市缺失解析县级
    - String getCountyWithoutCity(String address) 市缺失解析县级

    行政区数据来源

    http://www.mca.gov.cn/article/sj/xzqh/2019/201908/201908271607.html

    通过观察得到各级地区后缀名为
    • 一级

      • 自治区
      • 特别行政区
    • 二级

      • 自治州
      • 地区
    • 三级

      • 海域
    正则表达式
    //5级的后2级
    (?<town>[^区]+?区|.+?镇|.+?街道|.+?乡)?(?<village>.*)
    //7级的后4级
    (?<town>[^区]+区|.+?镇|.+?街道|.+?乡)?(?<village1>.+?街|.+?路|.+?巷)?(?<village2>[d]+?号|[d]+.?道)?(?<village3>.*)
    

    性能分析图



    耗时主要花在2部分1个是读取数据耗时,这个基本没得改,另一个是输入的地址和数据中的地址做匹配,尽量优化匹配的效率。

    单元测试

    测试用例
    1!李四,福建鼓楼13756899511鼓西街道湖滨路110号湖滨大厦一层.
    1!张三,福州市闽13599622362侯县上街镇福州大学10#111.
    1!刘湖,吉林省白山市六道江镇西村药店18694520738.
    1!王五,腾冲市满邑社区华园三小区47号18694520738.
    1!咸陡隐,江苏省苏州市吴江13184142847区平望镇新业织造有限公司吴江区平望镇双浜村村民委员会.
    2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
    2!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
    2!王五,云南省昭通市水富18694520738县云川路1号.
    2!王五,云南省迪庆藏族自治州18694520738香格里拉市.
    2!王五,四川省眉山市仁寿18694520738县黑龙滩镇牌坊街.
    2!王五,陕西省渭南市韩18694520738城市108国道附近.
    
    
    
    {"姓名":"李四","手机":"13756899511","地址":["福建省","","鼓楼区","鼓西街道","湖滨路110号湖滨大厦一层"]}
    {"姓名":"张三","手机":"13599622362","地址":["","福州市","闽侯县","上街镇","福州大学10#111"]}
    {"姓名":"刘湖","手机":"18694520738","地址":["吉林省","白山市","","六道江镇","西村药店"]}
    {"姓名":"王五","手机":"18694520738","地址":["","","腾冲市","满邑社区","华园三小区47号"]}
    {"姓名":"咸陡隐","手机":"13184142847","地址":["江苏省","苏州市","吴江区","平望镇","新业织造有限公司吴江区平望镇双浜村村民委员会"]}
    {"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]}
    {"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]}
    {"姓名":"王五","手机":"18694520738","地址":["云南省","昭通市","水富市","","云川路","1号",""]}
    {"姓名":"王五","手机":"18694520738","地址":["云南省","迪庆藏族自治州","香格里拉市","","","",""]}
    {"姓名":"王五","手机":"18694520738","地址":["四川省","眉山市","仁寿县","黑龙滩镇","牌坊街","",""]}
    {"姓名":"王五","手机":"18694520738","地址":["陕西省","渭南市","韩城市","","","108国道","附近"]}
    

    测试覆盖率

    异常处理

    • 只有手机号没有地址
      • 2!王五,18694520738
    • 没有选择难度
      • 王五,陕西省渭南市韩18694520738城市108国道附近.

    小总结和心路历程

    • 第一次了解国家各个行政区原来分这么多种
    • 测试真的给我做吐了
    • 算法无力,代码辣鸡,写个作业都费劲
    • 为什么测试这么麻烦的?
    • 中秋还要上课撸代码太惨了吧??
    • 来个大佬带带我(无能狂怒)
  • 相关阅读:
    day 13 python循环
    day 12 python开始--字符串
    day eleven 正则表达式以及shell基础学习
    day ten linux学习
    eight day linux网络基础
    设计模式
    JAVA中JDK和JRE的区别
    工作流基本概念__了解就行
    mybitis注解开发_curd操作
    Spring boot 整合SSM框架三层架构并前后台restful风格交互
  • 原文地址:https://www.cnblogs.com/Aka1i/p/11509595.html
Copyright © 2011-2022 走看看