作業說明詳見:http://m.survivalescaperooms.com/jiel/p/3978727.html
1.安裝Microsoft Visual Studio Ultimate 2012,之前安裝過一次,預計2小時左右,但是安裝過程中可以繼續進行其它任務。
2.閱讀題目要求,理解要實現的功能,預計20min左右。
3.根據題目,設計程序框架,預計10min左右。
4.閱讀相關文檔,學習所需要的類的命名空間,屬性和方法,預計1小時左右。
5.初步完成程序編寫,預計3小時左右。
6.設計測試數據,對出現的Bug進行改進,預計2小時左右。
1.安裝Microsoft Visual Studio Ultimate 2012,網址如下:
http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30678
網速較快用時1小時。
2.閱讀題目要求,理解要實現的功能:實現一個文本詞頻統計器,可以實現統計單詞數目,2聯短語數目,3聯短語數目。單詞比較忽略大小寫,輸出時按照詞頻從大到小排序,相等時按字典序排序,用時15min。
3.根據題目,設計程序框架,完善代碼:(用時大約4小時)
(1)根據讀入目錄路徑,獲取目錄子文件:

1 String[] files = Directory.GetFiles(path);View Code
(2)讀取每個文件的內容:

1 foreach (String i in files) 2 { 3 String extension = i.Substring(i.LastIndexOf(".")+1, i.Length - i.LastIndexOf(".")-1); 4 if (!extension.Equals("txt") && 5 !extension.Equals("cpp") && 6 !extension.Equals("h") && 7 !extension.Equals("cs")) continue;//只處理特定格式的文件 8 if (i.Equals(path+"http://"+"12061162.txt")) continue; 9 String[] text = rgxwords.Split(File.ReadAllText(i));10 }View Code(3)對于獲取的文本信息整理:先將文本拆分成若干行或者句子,設定三個Regex類,分別匹配單個單詞,2兩個由單個空格隔開的單詞,3個由單個單詞隔開的單詞。調用Regex.Match()方法和Regex.NextMatch方法匹配所有可匹配項:
數據存放數組定義如下:

1 ArrayList data = new ArrayList();//當前小說的單詞數據2 ArrayList word_word = new ArrayList();//e2模式短語的數據3 ArrayList word_word_word = new ArrayList();//e3模式短語的數據View Code
模板定義如下:

1 Regex rgxwords = new Regex("[/n/r,.//(//)//{//}//{//]:/"!;]+");//將文本拆分成一句或一行一個2 Regex regword1 = new Regex("[a-zA-Z]{3}[0-9a-zA-Z]*");//Simple mode的模式3 Regex regword2 = new Regex("[a-zA-Z]{3}[0-9a-zA-Z]* [a-zA-Z]{3}[0-9a-zA-Z]*");//Extended mode2的模式4 Regex regword3 = new Regex("[a-zA-Z]{3}[0-9a-zA-Z]* [a-zA-Z]{3}[0-9a-zA-Z]* [a-zA-Z]{3}[0-9a-zA-Z]*");//Extended mode3的模式View Code具體過程如下:

1 Match match = regword1.Match(text[j], 0); 2 while (match.Success) 3 { 4 data.Add(new Data(match.Value, 1));//simple mode的數據更新 5 match = match.NextMatch(); 6 } 7 Match match2 = regword2.Match(text[j], 0); 8 Match match1 = regword1.Match(text[j],match2.Index); 9 while (match2.Success)10 {11 word_word.Add(new Data(match2.Value, 1));12 match2 = regword2.Match(text[j], match1.Index+1);13 match1 = match1.NextMatch();14 }//extend mode2的數據更新15 match2 = regword3.Match(text[j], 0);16 match1 = regword1.Match(text[j],match2.Index);17 while (match2.Success)18 {19 word_word_word.Add(new Data(match2.Value, 1));20 match2 = regword3.Match(text[j], match1.Index + 1);21 match1 = match1.NextMatch();22 }//extend mode3的數據更新 View Code(4)對于存取數據的ArrayList類整理排序:主要運用ArrayList.sort(IComparer)方法,需要自己實現IComparer接口。

1 class myReverserClass1 : IComparer 2 //自定義比較器,用于字典序排序 3 { 4 int MyStringCompare(String x, String y) 5 //自定義了字符串比較方法: 6 //忽略大小寫排序,但是大寫相對靠前 7 //如hello,world,World,zoo 8 //排序后變成hello,World,world,zoo 9 {10 int lx = x.Count(), ly = y.Count(), i;11 String xx = x.ToUpper();12 String yy = y.ToUpper();13 for (i = 0; i < lx && i < ly; i++)14 if (xx[i] == yy[i]) continue;15 else return xx[i] - yy[i];16 if (i == lx && i < ly) return -1;17 else if (i < lx && i == ly) return 1;18 else19 {20 for (i = 0; i < lx && i < ly; i++)21 if (x[i] == y[i]) continue;22 else return y[i] - x[i];23 return 0;24 }25 }26 int IComparer.Compare(Object x, Object y)27 {28 return MyStringCompare(((Data)y).word, ((Data)x).word);29 }30 }31 class myReverserClass2 : IComparer32 //自定義比較器,用于單詞頻率排序33 {34 int MyStringCompare(String x, String y)35 //自定義了字符串比較方法:36 //忽略大小寫排序,但是大寫相對靠前37 //如hello,world,World,zoo38 //排序后變成hello,World,world,zoo39 {40 int lx = x.Count(), ly = y.Count(), i;41 String xx = x.ToUpper();42 String yy = y.ToUpper();43 for (i = 0; i < lx && i < ly; i++)44 if (xx[i] == yy[i]) continue;45 else return xx[i] - yy[i];46 if (i == lx && i < ly) return -1;47 else if (i < lx && i == ly) return 1;48 else49 {50 for (i = 0; i < lx && i < ly; i++)51 if (x[i] == y[i]) continue;52 else return y[i] - x[i];53 return 0;54 }55 }56 int IComparer.Compare(Object x, Object y)57 {58 if (((Data)x).num > ((Data)y).num) return -1;59 else if (((Data)x).num < ((Data)y).num) return 1;60 else return MyStringCompare(((Data)x).word, ((Data)y).word);61 }62 }View Code設計相關方法去掉重復單詞,記錄次數:

新聞熱點
疑難解答