日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第4周小组作业:WordCount优化

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第4周小组作业:WordCount优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Github項目地址:https://github.com/chaseMengdi/wcPro

stage1:代碼編寫+單元測試

PSP表格

PSP2.1

PSP階段

預估耗時(分鐘)

實際耗時(分鐘)

Planning

計劃

25

30

Estimate

估計任務需要多少時間

25

30

Development

開發

300

302

Analysis

需求分析

20

20

Design Spec

生成設計文檔

20

15

Design Review

設計復審

20

15

Coding Standard

代碼規范

20

15

Design

具體設計

20

25

Coding

具體編碼

90

80

Code Review

代碼復審

20

30

Test

測試

60

80

Reporting

報告

80

95

Test Report

測試報告

30

50

Size Measurement

計算工作量

30

25

Postmortem

總結

20

20

?

合計

405

430

描述代碼設計思路

接口設計

public?static?HashMap<String,?Integer>?count(String?thefile)

劃分統計單詞數

接口實現

count()函數傳入的是一個文件名,即txt文件名,通過逐行讀取文件,先將字符串轉換為小寫,通過split()函數對字符串進行劃分。個人技術有限,發現當字符串的最前面的字符是非字母的時候,split()劃分會出現不知名的空,故在使用split()進行劃分前需要先去掉字符串最前面的非字母字符,同時還有注意“-”出現的情況,如—word-word---,---,需要去開頭的“-”和結尾的“-”,而保留詞與詞間的“-”。然后進行單詞統計,將結果存放在HashMap<String, Integer>中。

// 劃分統計單詞數public static HashMap<String, Integer> count(String thefile) {File file = new File(thefile);HashMap<String, Integer> map = new HashMap<>();if (file.exists()) {try {FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis, "UTF-8");BufferedReader br = new BufferedReader(isr);String line = new String("");StringBuffer sb = new StringBuffer();while ((line = br.readLine()) != null) {// 轉為小寫 line = line.toLowerCase();int k = 0;// 去除行首的非字母單詞char first = line.charAt(k);while (!((first >= 'a' && first <= 'z') || first == '-')) {k++;first = line.charAt(k);}line = line.substring(k);// 去除多個空格\\s+ String[] split = line.split("\\s++|0|1|2|3|4|5|6|7|8|9|\\_|\\'|\\.|\\,|\\;|\\(|\\)|\\~|\\!|"+ "\\@|\\#|\\$|\\%|\\&|\\*|\\?|\""+ "|\\[|\\]|\\<|\\>|\\=|\\+|\\*|\\/|\\{|\\}|\\:|\\||\\^|\\`");for (int i = 0; i < split.length; i++) {// 獲取到每一個單詞 Integer integer = map.get(split[i]);// 考慮末尾為-的單詞或開頭為---if ((split[i].endsWith("-") || split[i].startsWith("-"))&& !(split[i].equals("-"))) {// 去除多個空格\\s+ String[] sp = split[i].split("\\s++|\\-");// 全部為----if (sp.length == 0) {split[i] = "-";integer = map.get(split[i]);}// 處理--danelse if (split[i].startsWith("-")) {int j = 0;char si = split[i].charAt(0);while (split[i].charAt(j) == si)j++;split[i] = split[i].substring(j);integer = map.get(split[i]);}// 去除多個空格\\s+ sp = split[i].split("\\s+|\\-");// 全部為----if (sp.length == 0) {split[i] = "-";integer = map.get(split[i]);}// 處理dn-dan---else {String tmp = sp[0];for (int j = 1; j < sp.length; j++) {tmp = tmp + "-" + sp[j];}split[i] = tmp;integer = map.get(split[i]);}}if (!split[i].equals("") && !split[i].equals("-")) {// 如果這個單詞在map中沒有,賦值1if (null == integer) {map.put(split[i], 1);} else {// 如果有,在原來的個數上加上一 map.put(split[i], ++integer);}}}}sb.append(line);br.close();isr.close();fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {System.out.print("文件不存在\n");}return map;}

?

測試設計過程

count()函數的測試設計應以黑盒設計為主,首先創建并初始化一個HashMap<String, Integer>和txt文件,隨后將txt文件名傳入count(),將實際輸出與期望輸出利用斷言進行對比。

20個測試用例設計如下:

?

Test Case ID

測試用例編號

Test Item

測試項(即功能模塊或函數)

Test Case Title

測試用例標題

Test Criticality

重要級別

?

Pre-condition

預置條件

Input

輸入

Output

預期結果

Result
實際結果

Status
是否通過

Remark

備注

count_01

劃分統計單詞數

一個單詞,小寫

????? L

txt文件存在

01.txt

單詞與詞頻

OK

黑盒測試

count_02

劃分統計單詞數

多個單詞,小寫

L

txt文件存在

02.txt

單詞與詞頻

OK

黑盒測試

count_03

劃分統計單詞數

一個單詞,大小寫混合

L

txt文件存在

03.txt

單詞與詞頻

OK

黑盒測試

count_04

劃分統計單詞數

多個單詞,大小寫混合

L

txt文件存在

04.txt

單詞與詞頻

OK

黑盒測試

count_05

劃分統計單詞數

一個單詞,大小寫+連字符混合

L

txt文件存在

05.txt

單詞與詞頻

OK

黑盒測試

count_06

劃分統計單詞數

多個單詞,大小寫+連字符混合

L

txt文件存在

06.txt

單詞與詞頻

OK

黑盒測試

count_07

劃分統計單詞數

一個單詞,大小寫+連字符(任意位置)混合

L

txt文件存在

07.txt

單詞與詞頻

OK

黑盒測試

count_08

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)混合

L

txt文件存在

08.txt

單詞與詞頻

OK

黑盒測試

count_09

劃分統計單詞數

一個單詞,大小寫+單引號混合

L

txt文件存在

09.txt

單詞與詞頻

OK

黑盒測試

count_10

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)+單引號混合

L

txt文件存在

10.txt

單詞與詞頻

OK

黑盒測試

count_11

劃分統計單詞數

一個單詞,大小寫+連字符+雙引號混合

L

txt文件存在

11.txt

單詞與詞頻

OK

黑盒測試

count_12

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)+單引號+雙引號混合

L

txt文件存在

12.txt

單詞與詞頻

OK

黑盒測試

count_13

劃分統計單詞數

一個單詞,大小寫+連字符(任意位置)+雙引號+數字混合

M

txt文件存在

13.txt

單詞與詞頻

OK

黑盒測試

count_14

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)+單引號+雙引號+數字混合

M

txt文件存在

14.txt

單詞與詞頻

OK

黑盒測試

count_15

劃分統計單詞數

一個單詞,大小寫+連字符(任意位置)+雙引號+數字(任意位置)混合

M

txt文件存在

15.txt

單詞與詞頻

OK

黑盒測試

count_16

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)+單引號+雙引號+數字(任意位置)混合

M

txt文件存在

16.txt

單詞與詞頻

OK

黑盒測試

count_17

劃分統計單詞數

一個單詞,大小寫+連字符(任意位置)+雙引號+數字(任意位置)+常見符號混合

M

txt文件存在

17.txt

單詞與詞頻

OK

黑盒測試

count_18

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)+單引號+雙引號+數字(任意位置)+常見符號混合

H

txt文件存在

18.txt

單詞與詞頻

OK

黑盒測試

count_19

劃分統計單詞數

一個單詞,大小寫+連字符(任意位置)+雙引號+數字(任意位置)+常見符號混合

H

txt文件存在

19.txt

單詞與詞頻

OK

黑盒測試

count_20

劃分統計單詞數

多個單詞,大小寫+連字符(任意位置)+單引號+雙引號+數字(任意位置)+常見符號+詞頻相同混合

H

txt文件存在

20.txt

單詞與詞頻

OK

黑盒測試

?

測試運行和評價

count(String thefile)的單元測試的數據量和復雜度逐漸增加,符合測試用例設計規范,所有單元測試均通過。

count(String thefile)函數質量水平較高,可以正常的劃分字符串和統計單詞。

小組貢獻

我負責的是劃分統計單詞數,這是本程序流程的第二步,如果出現錯誤,將會引起連鎖反應致使本程序不能正確運行,所以這部分的正確性是很重要。

剛開始用split()對字符串進行分割,但后來發現如果字符串的開始部分是分割字符將會導致分割到的第一個字符串為空(不知道為什么),故本人加入一個去除以非字母開始的字符直到出現第一個字母。由于出現“-”的單詞有幾種情況,還需要對它們進行判斷處理。

我個人的代碼行數占了0.51,主要是要求有點多,需要考慮的情況較多,個人覺得應該還是完成的挺不錯的.

stage2:靜態測試

開發規范理解

《阿里巴巴Java開發手冊》中指出:

2. 【強制】代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。 說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。注意,即使純拼音命名方式也要避免采用。
正例:alibaba / taobao / youku / hangzhou 等國際通用的名稱,可視同英文。

反例:DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變量 = 3

理解:

我覺得這點規定非常好,因為正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。而拼音英文混合和中文命名代碼的方式則不利于讀者閱讀代碼,也不利于性能優化和同行評審。我負責的單詞統計模塊代碼命名均為國機通用的英文,符合《阿里巴巴Java開發手冊》第二條的強制規定。

組員代碼評價

選擇劉博謙(17070)的代碼進行分析

// 詞頻排序public static ArrayList<String> sort(HashMap<String, Integer> map) {// 以Key進行排序TreeMap treemap = new TreeMap(map);// 以value進行排序ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(treemap.entrySet());Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2) {// 降序return o2.getValue() - o1.getValue();// 升序 o1.getValue() - o2.getValue()) }});ArrayList<String> str = new ArrayList<String>();int i = 0;for (Map.Entry<String, Integer> string : list) {// 排除-與空格if (!(string.getKey().equals("")) && !(string.getKey().equals("-"))) {str.add(string.getKey());str.add(string.getValue().toString());// 輸出前1000個單詞if (i > 1000)break;i++;}}return str;}

?

劉博謙的代碼遵守了《阿里巴巴Java開發手冊》第二條的強制規定,代碼命名規范,無需改進。

靜態代碼檢查

選擇工具:FindBugs 3.0.1

下載鏈接:http://findbugs.sourceforge.net/

檢查結果如下:

String line = new String("");

缺陷信息:

Method invokes inefficient new String(String) constructor

Using the java.lang.String(String) constructor wastes memory because the object so constructed will be functionally indistinguishable from the String passed as a parameter.? Just use the argument String directly.

Bug kind and pattern: Dm - DM_STRING_CTOR

分析:new String("")構造函數效率低,直接line=""即可。

個人代碼改進

個人代碼符合《阿里巴巴Java開發手冊》第二條的強制規定,改正FindBugs指出的缺陷后,代碼如下。

(完整代碼過于繁瑣,下面只貼出缺陷部分代碼修改后的結果)

?

FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis, "UTF-8");BufferedReader br = new BufferedReader(isr);String line = "";StringBuffer sb = new StringBuffer();

?

?

小組代碼分析

(此部分由本人和劉博謙(17070)完成)

1、FileWriter writer = new FileWriter("result.txt", true);

寫文件流可能關閉異常,應該使用try/finally來確保寫文件流會被成功關閉。

原有代碼中使用了try/catch,但是并未使用finally語句,這就導致如果出現錯誤跳到catch,程序繼續執行的話,寫文件流一直會被占用,從而可能引發程序崩潰。

建議添加finally塊來關閉寫文件流。

2、FileWriter writer = new FileWriter("result.txt", true);

此行語句需要依賴默認編碼來正常工作,為防止隱藏bug,應該指定一個編碼,考慮到程序需求,指定UTF-8編碼。

3、String line = new String("");

new String("")構造函數效率低,直接line=""即可。

4、message += (str.get(i) + " " + str.get(i + 1) + "\r\n");

循環中使用+來連接字符串,時間開銷為二次方,建議修改使用StringBUffer.append(String)方法來提高效率。

參考資料

1、單詞詞頻統計降序排序(代碼貼)

2、阿里巴巴Java開發手冊

轉載于:https://www.cnblogs.com/jakejian/p/8735660.html

總結

以上是生活随笔為你收集整理的第4周小组作业:WordCount优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。