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)
這個中秋好幸苦,學的也好多,我想休息一下(我最近都快一點睡的)
可愛的小兔子結尾 今晚可以早睡了
```