第一次我的編程做業

我的倉庫html

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]

關鍵代碼git

String regex="(?<province>[^省]+自治區|.*?省|.*?行政區|.*?市)(?<city>[^市]+自治州|.*?地區|.*?行政單位|.+盟|市轄區|.*?市|.*?縣)(?<county>[^縣]+縣|.+區|.+市|.+旗|.+海域|.+島)?(?<town>[^區]+區|.+鎮)?(?<village>.*)";

輸入輸出樣例github

//傳入參數
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國道附近.

小總結和心路歷程

  • 第一次瞭解國家各個行政區原來分這麼多種
  • 測試真的給我作吐了
  • 算法無力,代碼辣雞,寫個做業都費勁
  • 爲何測試這麼麻煩的?
  • 中秋還要上課擼代碼太慘了吧??
  • 來個大佬帶帶我(無能狂怒)
相關文章
相關標籤/搜索