日期:2014-05-18  浏览次数:20851 次

求一个排序提取的算法
一个文件(大约40M)
文件里面每一行都是一个网址

如一个文件:
http://forum.csdn.net/PointForum/Forum/PostTopic.aspx
http://forum.csdn.net/
http://csdn.net/
....

求:显示文件里面重复最多的10个网址,的算法!!!

速度要快!


格式如下:
------------------------------------
重复次数最多的10名
http://csdn.net/ 重复1000次
http://forum.XXXX.net/ 重复800次
http://XX.net/ 重复500次
.....


我比较笨,请写具体思路,或代码,谢谢



其实这个就类似“51啦”网页流量统计

------解决方案--------------------
C# code

public class TCount
    {
       private string _Url;
       public string Url {
           get { return _Url; }
           set { _Url = value; }
       }
       private int _Count;
       public int Count {
           get { return _Count; }
           set { _Count = value; }
       }

       public TCount(string _Url, int _Count) {
           this._Url = _Url;
           this._Count = _Count;
       }
    }
    public class DoCount {
        private string _FilePath;
        public string FilePath {
            get { return _FilePath; }
            set { _FilePath = value; }
        }
        public DoCount(string _FilePath) {
            this._FilePath = _FilePath;
        }

        /// <summary>
        /// 读取数据,并统计
        /// </summary>
        /// <returns></returns>
        public IList<TCount> CountUrl() {
            IList<TCount> IT = new List<TCount>();
            StreamReader sr = new StreamReader(this._FilePath);
            while (sr.ReadLine()!=null) {
                IT = ReCorrectCount(IT, sr.ReadLine());
            }
            sr.Close();
            return IT;
        }

        private IList<TCount> ReCorrectCount(IList<TCount> IT, string url) {
            int i = 0;
            bool blnIn = false; //用于标识url是否已存在于IT中
            foreach(TCount T in IT){
                if (T.Url == url) { //如果存在,则更新统计数
                    IT[i].Count += 1;
                    blnIn = true;
                    break;
                }
                i++;
            }
            if (!blnIn)//如果不存在则添加新项
                IT.Add(new TCount(url, 1));

            return IT;
        }
    }