simpson 发布留言 2008-1-10 13:19
统计文本文件中每个单词个数,并排序
一个文本文件(c:\test.txt)的内容由英文单词及分隔符组成(分隔符包括英文的空格、逗号、分号、点号、问号。分隔符可能连续出现,如空格),请用C#编写一个程序实现如下功能:
1) 统计文件中的所有不同单词,不区分大小写,并通过界面显示。
2) 统计每个单词在文件中出现的次数,并按照次数进行排序。
注意:文本文件可能很大,请考虑使用高效的数据结构。测试文件自行设计,请考虑通用性,评卷时会根据测试用例进行测试。
[ 本帖最后由 simpson 于 2008-1-15 13:29 编辑 [/italic]]
simpson 发布留言 2008-1-10 17:15
顶 至今23:00结帖
simpson 发布留言 2008-1-12 00:10
自己提的问题自己结
性能全部损耗在排序上,由于hashtable不能排序,所以只能借助其他来排序, 不过还好 一本60000字的书10几秒就能统计完.
using System.IO;
using System.Collections;//use hashtable
using System.Text.RegularExpressions;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void cmdStart_Click(object sender, EventArgs e)
{
string Pattern = @"\,|\.|\ |\n|\r|\?|\;|\:|\!|\(|\)|\042|\“|\”|\-|[\u4e00-\u9fa5]|[0-9]"; //匹配正值表达式 逗号,点号,空格,换行符,回车符,问号,,分号,,冒号,感叹号,,左括号,又括号,双引号,左双引号,右双引号,中文字符,数字
string textstring = "";
int j;
Hashtable ht = new Hashtable(); //创建一个Hashtable实例
//Hashtable ht = new Hashtable(); //创建一个Hashtable实例
Regex regex = new Regex(Pattern); //创建Regex实类
textBox2.Text = "";
//读取文件
try
{
StreamReader sr = new StreamReader(@textBox1.Text,System.Text.Encoding.GetEncoding("GB2312"));
textstring = sr.ReadToEnd();
sr.Close();
}
catch
{
MessageBox.Show("请把test.txt文件拷贝到C:/");
}
//根据匹配正值表达式分割字符串
string[] words = regex.Split(textstring);
//单词加入哈希表
foreach (string word in words)
{
//textBox2.Text = textBox2.Text + " " + i;
if (word != null && word != "")
{
if (ht.Contains(word))
{
j = Convert.ToInt32(ht[word]) + 1;
//ht.Remove(word);
//ht.Add(word, j);
ht[word]=j;
}
else
{
ht.Add(word, 1);
}
}
}
////对哈希表排序
ArrayList akeys = new ArrayList(ht.Keys);
//按字母顺序进行排序
//akeys.Sort() ;
//按字单词次数进行排序
string[] keyarray = new string[akeys.Count];
int[] valuearray = new int[akeys.Count];
int index=0;
//将key/value分别赋给数祖
foreach (string skey in akeys)
{
keyarray = Convert.ToString(skey);
valuearray = Convert.ToInt32(ht[skey]);
index++;
}
for(int a=0;a {
for (int b = a+1; b < akeys.Count; b++)
{
if (valuearray[a]>valuearray ^= valuearray ^= valuearray[a];
valuearray[a] ^= valuearray;
keyarray[a] = keyarray = tempstr;
}
}
}
//显示
//按字母顺序进行排序显示
//foreach(string skey in akeys)
//{
// textBox2.Text = textBox2.Text + skey + "\t" + ht[skey] + "\r\n";
//}
//按字单词次数进行排序显示
for (int a = 0; a < akeys.Count; a++)
{
textBox2.Text = textBox2.Text + keyarray[a] + "\t" + valuearray[a] + "\r\n";
}
}
}
}
[ 本帖最后由 simpson 于 2008-1-12 00:13 编辑 [/italic]]
simpson 发布留言 2008-1-15 13:29
求更高效的实现方法。。。
zhjesse 发布留言 2008-1-15 17:45
先学习一下了,C#文件操作还不会
以前经常是c操作文件,不知道有没有类似的东西
smoon 发布留言 2008-1-15 20:33
楼主为什么不吧源代码一起打包发上来啊?
冷星 发布留言 2008-2-5 22:48
正则表达式直接改成:
(?<[a-zA-Z])[a-zA-Z]+
[ 本帖最后由 冷星 于 2008-2-5 22:53 编辑 [/it]]
simpson 发布留言 2008-4-15 14:13
以下是引用 [un]冷星[/un] 在 2008-2-5 22:48 的发言:[/bo]
正则表达式直接改成: (? |
:victory
du543340914 发布留言 2008-9-16 08:41
楼主有点强悍,先借过来用用。谢谢。关键是代码太多,没时间打了。
du543340914 发布留言 2008-9-16 09:39
学姐,你能不能解释一下你的异常到底是什么。我把异常注释了,就不能用了。但是不注释,就非得把text.txt移动到C:\这是为什么。
du543340914 发布留言 2008-9-16 09:42
也不知道楼主什么时候能在看自己发的帖子,呜呜!真是痛苦!
页: [1]