項目html |
內容java |
該做業所屬課程git |
軟件工程github |
這個做業的要求出處算法 |
|
課程學習目標測試 |
熟悉軟件開發總體流程,提高自身能力ui |
本次做業在哪一個具體方面幫助咱們實現目標this |
第一次體驗一個完整的工程編碼 |
點評博客: |
|
Github連接地址: |
|
點評內容: |
首先,讀你的博客,我以爲你對功能設計這一塊的描述不夠完整,好比統計完單詞數量和詞頻後怎麼顯示出來?其次,運行完你的詞頻統計軟件以後,你的代碼規範,並且能夠處理任意英文文本,並且我發現你的柱狀圖也是實現了的,可是在博客中並無體現出來,因此我以爲你的截圖還有點問題。最後,在PSP中,有三個環節的計劃實際和實際時間都爲0,是你沒有考慮到仍是什麼緣由呢?固然,就博客總體而言,結構完整,整個博客背景精美,值得學習。 |
點評心得: |
在點評的過程當中,我發現咱們兩我的之間編碼風格有挺大的差別,包括在算法的實現以及功能實現的處理上,固然,針對這些差別,咱們須要作的就是互相學習對方的優勢,彌補本身的不足和缺點,盡本身最大的可能完善本身以前的軟件,互相團結合做以更好的實現以後的軟件 |
源碼可於此處查看,Wordfrequency文件夾中是最終的版本
需求分析
根據實驗四 軟件工程結對項目所提要求,咱們分析的主要需求有:
a. 可處理任意用戶輸入的任意英文文本功能;
b. 統計該文本的行數和字符數功能
c. 指定單詞詞頻統計功能;
d. 前k個高頻詞統計功能;
e. 統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt功能
f. 統計時計時功能;
g. GUI人機交互界面;
h. 統計文本中除冠詞、代詞、介詞以外的高頻詞;
在第二次實驗中,我沒有將各功能分開分別在幾個類中實現,因此這一次吸收了上一次的經驗教訓
該軟件共有10個類:
1. frequency.java類用於調用文本輸入界面MainWindows.java類;
2.MainWindows.java類用於實現文本輸入界面,當輸入一個文本名時若是存在,則順利進入功能選擇並實現界面OneWindows.java類,不然,彈出文件不存在的提示框;
3. OneWindows.java類利用JFrame的Button功能實現對各功能選擇界面的監聽,當獲取到各按鈕的id以後將實現各功能的界面,默認的界面是ChuLi.java類,當點擊按值排序的按鈕時調用GaoPin.java類,當點擊查詢單詞的按鈕時調用px.java類,當點擊保存退出的按鈕時將全部單詞按照字母表順序存放到result.txt文件中,將除了介詞、代詞、冠詞之外的其他詞彙按照詞頻從高到底的順序保存到result1.txt文件中,以後彈出提示信息:「文件已經將除了介詞、代詞、冠詞以外的單詞按詞頻高低保存到result1.txt中\n將全部的單詞按字典順序保存到result.txt中\n注:此處爲附加任務一所得結果」;
4. ChuLi.java類所實現的處理信息,包括:文本名、文本行數、文本字符數、分離文本中的單詞並統計各單詞詞頻所花費的時間;
5. px.java類用於實現輸入須要輸出的高頻詞彙的個數,點擊確認後,會將按照詞頻從高到低的順序輸出到OneWindows.java類的界面中;
6. GaoPin.java類用於實現從OneWindows.java類獲取一個字符串,而後調用WordQuery.java類類對該字符串進行處理;
7. wordQuery.java類用於將須要查詢的特殊詞對應的詞頻輸出而且將其繪製成JFrame所實現可視化柱狀圖;
8. SortMapByValue.java類根據映射的值排序,排序後可根據用戶輸入的k值進行輸出
9. SortMapByValue.java類根據映射的鍵排序,排序後將單詞以及單詞對應的詞頻保存至result.txt文件中
10.TongJiGaoPinCi.java類用於實現除了介詞、代詞、冠詞以外的其它詞以及其對應的高頻詞保存至result1.txt文件中。
輸入文本名界面,若文本不存在,則彈出提示框,不然處理文本並計時:
JButton en=new JButton("確認"); j3.add(en); this.add(j1); this.add(j2); this.add(j3); en.addActionListener(event ->{ Filename=FileName.getText(); if(Filename.length()==0) { FileName.setText("文件名不能爲空!"); } else { long date1=System.currentTimeMillis(); String regex = "[1234567890」「…—‘’ /=><【】、.。,,。\"!--;:?\'\\]]"; try { // 讀取要處理的文件 File f=new File(Filename); if(!f.exists()) { JOptionPane.showMessageDialog(null, "文件不存在", "警告", JOptionPane.ERROR_MESSAGE); FileName.setText(""); } else { this.setVisible(false); BufferedReader br = new BufferedReader(new FileReader(Filename)); String value; while ((value = br.readLine()) != null) { hang++; zifu+=value.length(); value = value.replaceAll(regex, " "); // 使用StringTokenizer來分詞 StringTokenizer tokenizer = new StringTokenizer(value); while (tokenizer.hasMoreTokens()) { String word = tokenizer.nextToken(); if (!hashMap.containsKey(word)) { hashMap.put(word, new Integer(1)); } else { int k = hashMap.get(word).intValue() + 1; hashMap.put(word, new Integer(k)); } } } br.close(); long date2=System.currentTimeMillis(); time=date2-date1; OneWindows o=new OneWindows(); o.setVisible(true); o.setSize(600,300); o.setLocation(300,200); o.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
經過獲取選擇按鈕的id,在原界面中加載實現相應功能的子界面:
ChuLi c=new ChuLi(); this.add(c,BorderLayout.CENTER); c.setVisible(true); GaoPin g=new GaoPin(); px p=new px(); b1.addActionListener(event ->{ this.add(c,BorderLayout.CENTER); c.setVisible(true); g.setVisible(false); p.setVisible(false); }); b2.addActionListener(event ->{ this.add(p,BorderLayout.CENTER); p.setVisible(true); g.setVisible(false); c.setVisible(false); }); b3.addActionListener(event ->{ this.add(g,BorderLayout.CENTER); g.setVisible(true); c.setVisible(false); p.setVisible(false); }); b4.addActionListener(event ->{ g.setVisible(false); c.setVisible(false); p.setVisible(false); TongJiGaoPinCi.tongjigaopinci(); SortMapByKeys.sortMapByKeys(); JOptionPane.showMessageDialog(null, "已經將所有單詞按字典順序保存reuslt.txt中\n將除了介詞、代詞、冠詞之外的其餘詞按照詞頻高低存放到result.txt中\n", "保存", J![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190402164039071-505842034.jpg) OptionPane.ERROR_MESSAGE); ![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190402135229436-1847344018.jpg) System.exit(0); });
文本處理功能,文本行數、字符數統計功能,詞頻統計所耗費的毫秒數功能(即計時功能):
文本未找到時彈出提示框功能:
按值排序功能:
查找單詞並繪製柱狀圖功能:
保存並退出功能(將除了介詞、代詞、冠詞的單詞按照詞頻的高低順序保存到result1.txt文件中,將全部單詞按照字母表順序保存到result.txt文件中):
result.txt文件的內容:
result1.txt文件的內容:
PSP2.1 |
任務內容 |
計劃共完成須要的時間(min) |
實際完成須要的時間(min) |
Planning |
計劃 |
10 |
8 |
Estimate |
估計這個任務須要多少時間,並規劃大體工做步驟 |
8 |
6 |
Development |
開發 |
120 |
150 |
Analysis |
需求分析 (包括學習新技術) |
6 |
10 |
Design Spec |
生成設計文檔 |
15 |
26 |
Design Review |
設計複審(和同事審覈設計文檔) |
4 |
5 |
Coding Standard |
代碼規範(爲目前的開發制定合適的規範) |
5 |
4 |
Design |
具體設計 |
10 |
15 |
Coding |
具體編碼 |
240 |
300 |
Code Review |
代碼複審 |
10 |
9 |
Test |
測試(自我測試,修改代碼,提交修改) |
20 |
25 |
Reporting |
報告 |
9 |
6 |
Test Report |
測試報告 |
10 |
8 |
Size Measurement |
計算工做量 |
2 |
2 |
Process Improvement Plan |
過後總結,並提出過程改進計劃 |
3 |
3 |
根據PSP表能夠看到,咱們在開發和編碼的時候實際時間遠多於計劃時間,這是因爲在開發和編碼的過程當中,JFrame圖形用戶界面的好多知識點已經忘了,因此在開發和編碼的過程當中須要不斷在網上和教材上去查找和從新學習相關的知識點,因此耗費的時間比較多。 在整個合做的過程當中,剛開始咱們坐在一塊兒討論了此次的實驗須要咱們作哪些工做,即用戶需求是什麼,接着就分工,由於個人實驗二採用的算法效率優於陳飛的,因此在此次的實驗中,咱們是在個人第二次實驗的基礎上進行修改的,由於個人GUI界面實現方面的能力很差,因此就由陳飛負責GUI界面功能的設計和實現,我則負責除去介詞、代詞、副詞後統計高頻詞功能、柱狀圖的可視化實現功能和計時功能。由於其他功能在第二次實驗中已經實現了,因此其他功能就將其更加細化並完善,以後由陳飛用圖形用戶界面實現。 固然,實驗二中存在的處理後文本有非單詞的狀況和沒有面向對象的思想的問題,在此次的實驗中也有努力的解決。