数据列表过滤重复值几种方法的性能比较

在现代日常应用中数据中有重复值,但我们需要过滤成一条的需求越来越多,那么如何在程序中设计过滤算法,同时还要考虑算法效率,因此这成了值得关注的问题

下面对两种算法进行比较

一.测试数据10 0000,过滤后结果只9810条

二.算法说明

方法一:用hashtable来保存数据列表,用hashtable的ContainsKey来判断是否重复来过滤.

方法二:用string的contains来判断是否重复来过滤.

三.算法代码

  /// <summary>
        /// 方法一.用hashtable来过滤重复值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            DateTime begin = DateTime.Now;
            Hashtable hash = new Hashtable();            
            ds = SqlHelper.ExecuteDataset(DBstr, CommandType.Text, sql);
            //过滤机制
            int len = ds.Tables[0].Rows.Count;
           // string tmp = "";
            for (int i = 0; i < len; i++)
            {
                if (!hash.ContainsKey(ds.Tables[0].Rows[i][0]))
                {                   
                    hash.Add(ds.Tables[0].Rows[i][0], ds.Tables[0].Rows[i][0]);                  
                }

            }     
            DataTable dt = new DataTable();
            DataColumn dcValue = new DataColumn("value", typeof(string));
            dt.Columns.Add(dcValue);
            //取得hasttable中的数据放到datatable中            
            IDictionaryEnumerator myEnumerator = hash.GetEnumerator();
            while (myEnumerator.MoveNext())
            {
                dt.Rows.Add(new string[] { Convert.ToString(myEnumerator.Key)});
            }            
            //绑定数据
            
            GridView1.DataSource = dt;
            GridView1.DataBind();
            ;
            lblmsg.Text = string.Format("共:{0}条,耗时:{1}", dt.Rows.Count, ((double)(((TimeSpan)(DateTime.Now - begin)).TotalSeconds)).ToString());
        }

        /// <summary>
        ///方法二. 采用string的Contains来过滤重复值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button2_Click(object sender, EventArgs e)
        {
            DateTime begin = DateTime.Now;
            StringBuilder strfilter = new StringBuilder();
            ds = SqlHelper.ExecuteDataset(DBstr, CommandType.Text, sql);
            //过滤机制
            int len = ds.Tables[0].Rows.Count;
            // string tmp = "";
            DataTable dt = new DataTable();
            DataColumn dcValue = new DataColumn("value", typeof(string));
            dt.Columns.Add(dcValue);
            for (int i = 0; i < len; i++)
            {               
                if (!("|" + strfilter.ToString()).Contains("|" + ds.Tables[0].Rows[i][0].ToString() + "|"))
                {
                     dt.Rows.Add(ds.Tables[0].Rows[i][0]);
                     strfilter.Append(ds.Tables[0].Rows[i][0].ToString() + "|");
                }
            }
            GridView1.DataSource = dt;
            GridView1.DataBind();
            ;
            lblmsg.Text = string.Format("共:{0}条,耗时:{1}", dt.Rows.Count, ((double)(((TimeSpan)(DateTime.Now - begin)).TotalSeconds)).ToString());

        }

四.测试结果

方法一:hashtable

方法二:string字符过滤

Label 共:9810条,耗时:67.921875

比较两种方法耗时相关67倍.

五.结论

在数据过滤过程中用hashtable性能明显优于string的contains或indexOf的方法.


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Set 和 Map 来实现前端数组去重,具体代码如下:1. 使用 Set: ``` let arr = [1, 2, 2, 4, 5, 4]; let newArr = [...new Set(arr)]; console.log(newArr); // [1, 2, 4, 5] ```2. 使用 Map: ``` let arr = [1, 2, 2, 4, 5, 4]; let map = new Map();for (let item of arr) { if(!map.has(item)) { map.set(item, true); } }let newArr = Array.from(map.keys()); console.log(newArr); // [1, 2, 4, 5] ``` ### 回答2: 前端数组去重的几种方法代码可以有以下几种: 1. 使用Set:将数组转换为Set对象,Set对象会自动过滤重复的元素,然后再将Set对象转换回数组。 ```javascript const uniqueArray = (array) => [...new Set(array)]; ``` 2. 使用filter和indexOf:遍历数组,通过indexOf判断元素在数组中的第一个索引是否等于当前索引,如果相等则表示是唯一的元素。 ```javascript const uniqueArray = (array) => array.filter((item, index) => array.indexOf(item) === index); ``` 3. 使用reduce和includes:遍历数组,通过includes判断是否已经存在相同的元素,如果不存在则添加到结果数组中。 ```javascript const uniqueArray = (array) => array.reduce((result, item) => { if (!result.includes(item)) { result.push(item); } return result; }, []); ``` 4. 使用Map:遍历数组,将元素作为Map的键,判断是否已经存在该键,如果不存在则添加到结果数组中。 ```javascript const uniqueArray = (array) => { const map = new Map(); const result = []; for (const item of array) { if (!map.has(item)) { map.set(item, true); result.push(item); } } return result; }; ``` 以上是几种常见的前端数组去重方法,根据具体的情况选择适用的方法。 ### 回答3: 前端数组去重的几种方法代码如下: 1. 使用Set数据结构去重: ``` let arr = [1, 2, 2, 3, 3, 4, 5, 5]; let newArr = [...new Set(arr)]; console.log(newArr); // [1, 2, 3, 4, 5] ``` 2. 使用filter方法去重: ``` let arr = [1, 2, 2, 3, 3, 4, 5, 5]; let newArr = arr.filter((item, index) => arr.indexOf(item) === index); console.log(newArr); // [1, 2, 3, 4, 5] ``` 3. 使用reduce方法去重: ``` let arr = [1, 2, 2, 3, 3, 4, 5, 5]; let newArr = arr.reduce((prev, curr) => { if (!prev.includes(curr)) { prev.push(curr); } return prev; }, []); console.log(newArr); // [1, 2, 3, 4, 5] ``` 4. 使用Map数据结构去重: ``` let arr = [1, 2, 2, 3, 3, 4, 5, 5]; let newArr = Array.from(new Map(arr.map(item => [item, item])).values()); console.log(newArr); // [1, 2, 3, 4, 5] ``` 这些方法都可以实现数组去重的功能,具体使用哪种方法取决于项目需求和性能要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值