统计英文文档里每个单词出现的次数
最近想实现一个统计英文档单词出现次数的功能。
查找规则是将文档里连续出现的<字母>判断为一个单词,如:“D) Let's go to d”,会将其判断为D、Let、s、go、to五个单词并统计出现的次数并不区分大小;
//这个类用来存放出现的单词和其出现的次数 public class WordNode { public string word; public int count; } /// <summary> /// 传入要统计的文本字符串,函数会返回WordNode列表,里面有文本字符串中出现的单词和单词出现的次数 /// </summary> /// <param name="theSource"></param> /// <returns></returns> public List<WordNode> GetAllWord(string theSource) { //为了可以检索到最后一个单词,需在被检索字符串的末尾加一个非字母字符 string source = theSource + "*"; //取出字母的ascii码 int aInt = 'a'; int zInt = 'z'; int AInt = 'A'; int ZInt = 'Z'; string getWord = string.Empty; WordNode wordNode; WordNode foundWordNode; List<WordNode> result = new List<WordNode>(); int sourceLength = source.Length; int charCount = 0; for (int i = 0; i < sourceLength; i++) { if ((source[i] >= aInt && source[i] <= zInt) || (source[i] >= AInt && source[i] <= ZInt))//判断是不是字母 { charCount++;//如果字符是字母则charCount加1 } else { if (charCount > 0) { getWord = source.Substring(i - charCount, charCount); wordNode = new WordNode { word = getWord }; //判断列表里有没有对应的词 if (!result.Exists(x => x.word.Equals(wordNode.word, StringComparison.CurrentCultureIgnoreCase)))//不存在就把wordNode加进去 { wordNode.count++; result.Add(wordNode); } else//存在就把对应的wordNode取出来,并把count加1; { foundWordNode = result.Find(x => x.word.Equals(wordNode.word, StringComparison.CurrentCultureIgnoreCase)); foundWordNode.count++; } charCount = 0; } } } InsertSort(result, result.Count); return result; } /// <summary> /// 将统计过并返回的List<WordNode>按WordNode.count进行降序排序 /// </summary> /// <param name="wordNodes"></param> /// <param name="count">值是wordNodes.count</param> public void InsertSort(List<WordNode> wordNodes, int count) { for (int i = 1; i < count; i++) { if (wordNodes[i].count > wordNodes[i - 1].count) { //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 int j = i - 1; var x = wordNodes[i]; //复制为哨兵,即存储待排序元素 wordNodes[i] = wordNodes[i - 1]; //先后移一个元素 while ( j >= 0 && x .count > wordNodes[j].count) { //查找在有序表的插入位置 wordNodes[j + 1] = wordNodes[j]; j--; //元素后移 } wordNodes[j + 1] = x; //插入到正确位置 } } }
最后将将序排序过的统计结果wordNodes输出:
下面截图是“D) Let's go to d”的统计结果