| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8833 人关注过本帖
标题:统计文本文件中每个单词个数,并排序
取消只看楼主 加入收藏
simpson
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:863
专家分:17
注 册:2006-11-16
收藏
 问题点数:0 回复次数:4 
统计文本文件中每个单词个数,并排序
一个文本文件(c:\test.txt)的内容由英文单词及分隔符组成(分隔符包括英文的空格、逗号、分号、点号、问号。分隔符可能连续出现,如空格),请用C#编写一个程序实现如下功能:
1)  统计文件中的所有不同单词,不区分大小写,并通过界面显示。
2)  统计每个单词在文件中出现的次数,并按照次数进行排序。
注意:文本文件可能很大,请考虑使用高效的数据结构。测试文件自行设计,请考虑通用性,评卷时会根据测试用例进行测试。

[[italic] 本帖最后由 simpson 于 2008-1-15 13:29 编辑 [/italic]]
搜索更多相关主题的帖子: 文本文件 单词 统计 
2008-01-10 13:19
simpson
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:863
专家分:17
注 册:2006-11-16
收藏
得分:0 
顶 至今23:00结帖

全国最大的 Java专业电子书免费分享[url]http:///in.asp?id=xrmao[/url]
2008-01-10 17:15
simpson
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:863
专家分:17
注 册:2006-11-16
收藏
得分:0 
自己提的问题自己结
性能全部损耗在排序上,由于hashtable不能排序,所以只能借助其他来排序,  不过还好  一本60000字的书10几秒就能统计完.

using
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[index] = Convert.ToString(skey);
                    valuearray[index] = Convert.ToInt32(ht[skey]);
                    index++;
                }
                for(int a=0;a<akeys.Count;a++)
                {
                    for (int b = a+1; b < akeys.Count; b++)
                    {
                        if (valuearray[a]>valuearray[b])
                        {
                            valuearray[a] ^= valuearray[b];
                            valuearray[b] ^= valuearray[a];
                            valuearray[a] ^= valuearray[b];
                            string tempstr = keyarray[a];
                            keyarray[a] = keyarray[b];
                            keyarray[b] = 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";
                }
        }
    }
}

[[italic] 本帖最后由 simpson 于 2008-1-12 00:13 编辑 [/italic]]

全国最大的 Java专业电子书免费分享[url]http:///in.asp?id=xrmao[/url]
2008-01-12 00:10
simpson
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:863
专家分:17
注 册:2006-11-16
收藏
得分:0 
求更高效的实现方法。。。

全国最大的 Java专业电子书免费分享[url]http:///in.asp?id=xrmao[/url]
2008-01-15 13:29
simpson
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:863
专家分:17
注 册:2006-11-16
收藏
得分:0 
[bo]以下是引用 [un]冷星[/un] 在 2008-2-5 22:48 的发言:[/bo]

正则表达式直接改成:
(?



:victory

全国最大的 Java专业电子书免费分享[url]http:///in.asp?id=xrmao[/url]
2008-04-15 14:13
快速回复:统计文本文件中每个单词个数,并排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048694 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved