z


GitHub地址

 

Github地址

 

PSP表格

 

PSP2.1 Personal Software Process Stages 預估耗時(分鍾) 實際耗時(分鍾)
Planning 計划 30 40
· Estimate · 估計這個任務需要多少時間 30 40
Development 開發 1010 1480
· Analysis · 需求分析 (包括學習新技術) 180 610
· Design Spec · 生成設計文檔 20 25
· Design Review · 設計復審 30 15
· Coding Standard · 代碼規范 (為目前的開發制定合適的規范) 30 30
· Design · 具體設計 150 150
· Coding · 具體編碼 350 500
· Code Review · 代碼復審 100 50
. Test · 測試(自我測試,修改代碼,提交修改 150 100
Reporting 報告 75 120
· Test Repor · 測試報告 5 10
· Size Measurement · 計算工作量 15 20
· Postmortem & Process Improvement Plan · 事后總結, 並提出過程改進計划 50 50
  · 合計 1115 1640

 

解題思路

思考過程

一開始沒有啥思路,腦海比較空白,一開始想着讀字符串讀到省就取出省,讀到市就取出市 (比較傻憨憨的思路)。后來就翻之前筆記,發現正則表達式是個不錯的方法,然后想咋寫呢,就去網上搜索了下 java 中國地址匹配,果然讓我搜索到了一些東西,果然要善用搜索引擎,然后借鑒了一下代碼,就開始着手去寫啦。

 

找資料過程

對於我這個菜雞,真的看了這個布置作業的博客超級超級多看不懂,然后把不懂的一個個復制到百度一個個研究。

 

我這段時間用到的資料們

資料地址 說明
匹配地址 代碼的思路很多是這個給的
中國各個地址分類 讓我研究中國的省市縣啥的看看還有那些沒匹配上
代碼質量分析 分析代碼質量用什么
性能分析JProfiler JProfiler的安裝和使用
單元測試的理解 看了這個大概了解了單元測試
Junit的基本使用 如何單元測試
打包成jar 如何打包成jar包(沒按照助教要求的gradle)當時時間不太夠用這個快
遇到一些打包問題的處理 打包時候遇到的問題有沒有找到主清單屬性以及找不到依賴包
StartUML教程 我英文也太菜了把,准備用StartUML畫流程圖看到一堆英文傻了,去網上看了下教程
關於UML 順帶大致看了UML
UML流程圖 一些畫流程圖的規范
gradle解析 還是要學的
gradle快速入門  

 

代碼思路

用java編寫

1.通過文件輸入流讀取文件

2.把每個用戶的信息(行)從整個文件中分別取出來放入字符串數組

3.遍歷數值

3.1用正則表達式提取手機號和名字信息,並且將這些從原字符串數組刪除

3.2用正則表達式分出地址信息

4.通過文件輸出流傳出文件

 

實現過程

 

主要的類

類名 作用
Main 開始類(文件輸入輸出流,調用Util里的方法)
Util 處理姓名手機地址信息
UserInfo 暫時存放一個用戶信息
TotalInfo 所有處理后的用戶信息合集

 

主要函數

函數名 作用
separateTotalInfo(String totalAddress) 用來調用處理信息的各個函數
getName(String info) 從信息中得到用戶名
separateName(String info) 從信息中刪除用戶名
getPhone(String info) 從信息中得到手機號
separatePhone(String info) 從信息中刪除手機號
getAddress(String level,String info) 從信息中得到成功分段的地址
disposeFile(String filePath) 處理輸入的文件流
produceJsonFile(TotalInfo totalInfo,String filePath) 處理輸出的文件流

 

關鍵函數流程圖

separateTotalInfo(String totalAddress)的流程圖

 

改進過程

 

改進思路

我代碼其實沒怎么改進(因為不知道怎么改,么得思路)

非得說改進的話,本來只能把地址分成五層,后來七層也可以了可以滿足分成五層也可以七層

 

性能分析圖

用JProfiler生成的,消耗最大的函數是separateTotalInfo(String totalAddress)

 

代碼說明

 

關鍵代碼說明

這是把地址分為五層的核心代碼(七層和這個同理)

思路就是正則表達式匹配省市縣區在取出放入List里

 1  String regex="(?<province>[^省]+自治區|.*?省|.*?行政區)?(?<city>[^市]+自治州|.*?地區|.*?行政單位|.+盟|市轄區|.*?市)?(?<dist>[^縣]+縣|.+?區|.+市|.+旗|.+海域|.+島)?(?<town>[^區]+鎮|.+街道)?(?<village>.*)";
 2                 
 3              Pattern pattern=Pattern.compile(regex);
 4              Matcher matcher=pattern.matcher(info);
 5              
 6              if(matcher.find()){
 7                     
 8                     province=matcher.group("province");//區配省
 9                     addressList.add(province==null?"":province.trim());//取出省
10                   
11                     city=matcher.group("city");//區配市
12                     addressList.add(city==null?"":city.trim());//取出市
13                     
14                     dist=matcher.group("dist");//匹配縣
15                     addressList.add(dist==null?"":dist.trim());//取出縣
16                     
17                     town=matcher.group("town");//匹配區
18                     addressList.add(town==null?"":town.trim());//取出區
19                     
20                     village=matcher.group("village");//取出剩下的
21                     addressList.add(village==null?"":village.trim());  //取出剩下的
22                  
23             }
 
        

算法的關鍵

正則表達式匹配(省市縣區街)地址

難度1. 把地址分為五級的

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

難度2. 把地址分為七級的

String regex="(?<province>[^省]+自治區|.*?省|.*?行政區)?(?<city>[^市]+自治州|.*?地區|.*?行政單位|.+盟|市轄區|.*?市)?(?<dist>[^縣]+縣|.+?區|.+市|.+旗|.+海域|.+島)?(?<town>[^區]+鎮|.+街道|.+鄉|.+縣)?(?<village>[^村]+路|.+街|.+巷|.+道|.+段|.+隊|.+弄|.+胡同|.+村|.+委會|.+開發區)?(?<number>[^區號]+號)?(?<road>.*)";

 

難度3. 補全缺省地址(附加題)

沒寫出來

 

(其實不太完善,認真臉!)

張三,福建福州閩13599622362侯縣上街鎮福州大學10#111.

張三我dbq 我沒能把你的地址完善出來(;´д`)ゞ是我太菜了

這個我思考了一下估計搞個文件放地址,然后遍歷匹配到福建就加個省,匹配到城市就把它的后綴名加上市/自治區(沒時間搞了所以沒搞 dbq)

沒試過這個思路對不對,如果有不對或者哪里不夠的希望大佬指出,3Q~

(看到好多大佬用的python,我沒學,應該把學python提上日程了)

 

計算模塊部分單元測試

 

單元測試

用的Junit

 

部分單元測試代碼

 1     @Test
 2     public void testGetAddress1() {
 3         List<String> addressList=new ArrayList<>();
 4         addressList.add("福建省");
 5         addressList.add("泉州市");
 6         addressList.add("南安市");
 7         addressList.add("霞美鎮");
 8         addressList.add("美西街");
 9         addressList.add("41號");
10         addressList.add("青青飯店");
11         assertEquals(addressList,util.getAddress("2","福建省泉州市南安市霞美鎮美西街41號青青飯店"));
12     }

 

測試七層地址分割數據是否准確,沒有用到很復雜的單元測試代碼,因為單元的功能沒有很多,我的代碼也沒有很復雜

 

測試覆蓋率

 

ps:那個com.view的AddressView是用swing寫的界面函數,一開始是打算有界面輸入混亂的地址,然后還有一個界面提醒整理好的地址(因為覺得這樣可讀性比較高,雖然java的swing很老啦現在也不用啦,但是當時想的是做個界面輸入輸出就不是黑框框啦)后來助教要求在控制台輸入,所以界面就沒有用啦(但是鑒於我幸苦寫出來的,所以沒有刪除,我必須把我寫的界面拿出來遛遛,很丑哈哈哈,但是勞動成果嘛)

至於那個test文件是用來放單元測試的

 

Code Quality Analysis

用的findBugs

 

計算模塊的異常處理

java中如果要進行異常處理,可以使用:try、catch、finally關鍵字

但我目前只會printStackTrace()輸出完整的異常信息,還不會修改異常信息的提示

(對不起 我太菜了 悄咪咪說能少扣點分么

 

學習心得

我看到博客的一瞬間心情復雜,我是誰我在哪,360°旋轉懵逼(ノ`Д)ノ

然后就是慢慢百度學習的過程,果然是善用搜索呀

雖然我代碼寫的一點也不好,但是我真的用了超級多的時間,零散的時間我都忽略了,我太菜了,中秋假期我都沒有出門,就是坐在家里寫代碼,我作業從周二寫到現在(我很多不會,所以寫了這么久),好多親戚都對我大學還有作業吃驚,(誇我認真學習emmm受之有愧,認真學習的學霸們才不會像我這樣啥都不會呢)

單元測試,代碼質量分析,分支覆蓋率,打包。。。。。。我都不會 (我tcl)

這個中秋好幸苦,學的也好多,我想休息一下(我最近都快一點睡的)

可愛的小兔子結尾 今晚可以早睡了

 

```


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM