第二次作業 - 個人項目
阿新 • • 發佈:2018-09-12
stand 問題 intellij mat [] str 匹配 def 覆蓋
第二次作業 - 個人項目
1.GitHub地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
· Estimate | · 估計這個任務需要多少時間 | 15 | 20 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 60 | 90 |
· Design Spec | · 生成設計文檔 | 20 | 30 |
· Design Review | · 設計復審 | 30 | 60 |
· Coding Standard | · 代碼規範 (為目前的開發制定合適的規範) | 5 | 5 |
· Design | · 具體設計 | 30 | 30 |
· Coding | · 具體編碼 | 180 | 350 |
· Code Review | · 代碼復審 | 30 | 40 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 30 | 90 |
Reporting | 報告 | ||
· Test Repor | · 測試報告 | 30 | 50 |
· Size Measurement | · 計算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事後總結, 並提出過程改進計劃 | 30 | 60 |
合計 | 480 | 855 |
3.運行環境
- 語言:Java
- IDE: IntelliJ IDEA 2018.2.3
- 操作系統:Windows10 64bit
4.解題思路
剛拿到題目的第一反應是利用正則表達式進行詞頻統計。 通過正則表達式進行匹配,同時正則表達式匹配空白行,正則表達式匹配ASCII字符。
整個過程的思路是這樣子:
- 先讀入整個文本,將內容讀進字符串,用 \p{ASCII} 進行匹配完成字符統計。
- 讀入文件,每次讀一行,用 \s+ 進行匹配判斷是否是空白行。
- 單詞統計先將內容用 \s+ 進行分割, 在用 ^[a-zA-Z]{4,}.* 進行判斷是否是單詞。存入Map中,
如果不存在Map中就put同時設置value為1,如果已經在Map中那麽value++。
5.設計實現過程
CalMost: 對詞頻進行排序,返回最多的前10個
CharsCount: 完成對字符個數的統計
LinesCount: 完成對行數的統計
WordsCount: 對單詞個數進行統計,同時生成Map
6.代碼規範
- 類名首字母大寫,方法與變量采用駝峰式命名法。
- 註釋采用 Java 文檔註釋規範
例如:
/**
* @param map the HashMap contain words and amount
* @return the top 10 amount of the words and amount in list
*/
public List<Map.Entry<String, Integer>> mostWords(HashMap<String, Integer> map)
- 行寬不超過IDEA默認行寬(120)
7.性能分析
利用VisualVM進行性能分析,以下是執行100000次的結果
可以看出主要耗時還是載輸出到文件這裏。後續再想辦法看看有沒有優化的空間。最近時間不夠用了
8.代碼說明
- 對詞頻進行排序並返回前10個,若不足10個就返回當前個數。
/**
* @param map the HashMap contain words and amount
* @return the top 10 amount of the words and amount in list
*/
public List<Map.Entry<String, Integer>> mostWords(HashMap<String, Integer> map) {
// convert HashMap to list
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
// sort by value then by key
list.sort(new MapComparator());
return list.size() < 10 ? list.subList(0, list.size()) : list.subList(0, 10);
}
/**
* This class define how to compare the element in list
*/
private class MapComparator implements Comparator<Map.Entry<String, Integer>> {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()) != 0 ? o2.getValue().compareTo(o1.getValue()) : o1.getKey().compareTo(o2.getKey());
}
}
- 單詞統計:轉換成小寫之後進行統計。
/**
* @param content the input
*/
public WordsCount(String content) {
String[] temp = content.split("\\s+");
String countRegex = "^[a-zA-Z]{4,}.*";
for (String i : temp) {
if (i.matches(countRegex)) {
sum++;
String lowCase = i.toLowerCase();
if (!map.containsKey(lowCase)) {
map.put(lowCase, 1);
} else {
int num = map.get(lowCase);
map.put(lowCase, num + 1);
}
}
}
}
9.測試單元
覆蓋率應該算還行吧,每個方法都有覆蓋到。
LinesCount中有個catch中的沒有覆蓋到。
10.總結和感想
這次看了一些測試相關的東西,之前自己寫東西都沒有用過單元測試,或者就自己直接print出來,測試幾個是否跟自己的預期符合。沒有過寫單元測試的經歷。
通過這次,了解了單元測試的有點,當項目較大時,通過測試更能提前發現問題。
完成作業所花的時間跟自己的預期差距也是比較大的。一開始覺得自己一直都陸陸續續有在寫Android,做這個應該不會很花時間。後面才發現...Android...Java差別還是有的,主要原因還是自己對Java的掌握還是不夠深。接下來以還是要花些時間加深對Java的掌握。
本次作業完成的質量,個人並不是很滿意,因為手頭上同時還有不少代碼要寫希望趕緊寫完,好累好累,所以時間精力並沒有充分投入,希望下一次作業能讓自己比較滿意。
第二次作業 - 個人項目