一.完成一个小程序
今天的任务是处理一本英文小说。我处理的英文小说是《war and peace》
本想着用多线程来解决的,发现看书还不是太懂,并不能真正动手编程。
我在编程的过程中主要遇到了以下两个问题:
1.在对整个英文小说进行单词总数统计遇见困难。
2.字符串数组的空字符串处理问题。因为我开始用空格来代替标点等不是英文单词来进行对单词分割,其中用到了正则表达式,后来统计对单词出现频数时,发现空格竟然排第一名,有4万多空格。
最终我的处理方式是使用List泛型集合的ForEach方法循环获取非空空字符串。
参考博客链接http://blog.csdn.net/orichisonic/article/details/49334397
这个博主提供了三种处理字符串数组的方法,大家感兴趣,可以学习一下。
我的实现代码如下:
namespace wd { class Program { //static Dictionary<string, int> result = new Dictionary<string, int>(50000); static void Main(string[] args) { string theBookName; Console.Write(">wf "); theBookName = Console.ReadLine(); string path = @"F:\hello\war_and_peace"; string[] fs = Directory.GetFiles(path); string rline = null; foreach (string file in fs) { rline = ReadFile(file); rline = rline.ToLower(); //使用正则表达式 //Regex regex = new Regex(@"\b[A-Za-z]+[A-Za-z0-9]*"); rline=Regex.Replace(rline, @"[^a-zA-Z0-9\u4e00-\u9fa5\s]"," "); rline = Regex.Replace(rline, "[[email protected]#$%^&*()`,./;‘:\"<>`?...]"," "); string[]S= rline.Split(‘ ‘); //使用lambda表达式筛选过滤掉数组中空字符串 //S = S.Where(S >= !string.IsNullOrEmpty(S)).ToArray(); //Compute(rline); // var outputResult = from KVP in result // orderby KVP.Value descending // select new StringBuilder(KVP.Key).Append(" ").Append(KVP.Value); //foreach (var str in outputResult) // { // Console.WriteLine(str); //} /* *使用List泛型集合的ForEach方法循环获取非空空字符串 *这里使用了匿名方法 */ List<string> list = new List<string>(); S.ToList().ForEach( (s) => { if (!string.IsNullOrEmpty(s)) { list.Add(s); } } ); S = list.ToArray(); Console.WriteLine("total " + rline.Length + " words"); Console.WriteLine(); Hashtable ha = new Hashtable(); for (int i = 0; i < S.Length; i++) { if (ha.ContainsKey(S[i])) { ha[S[i]] = (int)ha[S[i]] + 1; } else { ha.Add(S[i], 1); } } string[] arrKey = new string[ha.Count];//存哈希表的键 int[] arrValue = new int[ha.Count];//存哈希表的值 ha.Keys.CopyTo(arrKey, 0); ha.Values.CopyTo(arrValue, 0); Array.Sort(arrValue, arrKey);//按哈希表的值进行排序 wd.Program p = new wd.Program(); p.ShowArr2(arrKey, arrValue); // Console.ReadKey(); } } //读取文件 private static string ReadFile(string file) { string readLine; FileStream fs = new FileStream(file, FileMode.Open); StreamReader sr = new StreamReader(fs); readLine = sr.ReadToEnd(); sr.Close(); fs.Close(); return readLine; } //统计文件中不重复的单词总数及每个单词的词频 //public void CountEachWord(string arrkey, int arrvalue) // { // Hashtable ht = new Hashtable(); //int count = 0; //单词总数 // StreamReader streamReader = new StreamReader(arrkey); // string line; // Regex regex = new Regex(@"\b[A-Za-z]+[A-Za-z0-9]*"); //while ((line = streamReader.ReadLine()) != null) // { // MatchCollection matchCollection = regex.Matches(line); // foreach (Match word in matchCollection) // { // string words = word.ToString(); // if (ht.Contains(words)) // { // int j = Convert.ToInt32(ht[words]) + 1; // ht[words] = j; // } // else // { // ht.Add(words, 1); // } // } // } //输出单词总数 // count = ht.Keys.Count; // Console.WriteLine("total " + count + " words"); // } //输出 public void ShowArr1(string[] keyArray, int[] valueArray) { for (int i = keyArray.Length-1; i >=0; i--) { Console.WriteLine(keyArray[i].ToString().PadRight(15)); Console.WriteLine(valueArray[i].ToString()); } } // public void ShowArr2(string[] keyArray, int[] valueArray) { if (keyArray.Length < 10) { ShowArr1( keyArray, valueArray); } else { int sum = 0; for (int j = keyArray.Length - 1; j >=0; j--) { Console.Write(keyArray[j].ToString().PadRight(15)); Console.WriteLine(valueArray[j].ToString()); sum++; if (sum >= 10) break; } } } } }
实现的截图如下:
二.例行报告
1.PSP(personal software process)个人软件过程
类型 | 任务 | 开始时间 | 结束时间 | 中断时间 | 净时间 |
看书 | 学习多线程和泛型 | 2017.9.17 10:30 | 2017.9.17 12:00 | 无 | 90min |
编程 | 写代码 | 2017.9.17 14:30 | 2017.9.17 17:00 | 回复消息5min,厕所10min | 2h15min |
写作 | 写随笔 | 2017.9.17 17:00 | 2017.9.17 17:30 | 无 | 30min |
2.进度条
代码行 | 博文字数 | 知识点 | |
第二周 | 166 | 750 | 见博客词频统计-功能二 |
时间: 2024-10-02 11:07:47