• 算法:C#数组去除重复元素算法研究


    可以在网上找到的代码:

    string[] stringArray = { "aaa", "bbb", "aaa", "ccc", "bbb", "ddd", "ccc", "aaa", "bbb", "ddd" };
    //List用于存储从数组里取出来的不相同的元素
    List<string> listString =new List<string>();
    foreach (string eachString in stringArray)
    {
    if (!listString.Contains(eachString))
    listString.Add(eachString);
    }
    //最后从List里取出各个字符串进行操作
    foreach (string eachString in listString)
    {
    Console.Write(eachString);
    //打印每个字符串
    }

    原理应该比较容易理解吧,通过遍历原数组中的每一个元素,将元素添加到新的泛型listString中,如果listString已经包含了就不添加,当遍历完原数组,泛型中保存的就是去重后的结果了。

    在数据量小的时候用这个算法还OK,但如果数据量比较大时(我工作中需要将5万以上左右的数据去重)其效率就不是那么让人接受了,一次处理需要耗费近1分钟左右的时间(测试电脑用的Inter Pentium D 2.8GHz、1G内存)

    由于需求对结果的元素序列没有任何要求,我采取了下列算法来提高效率

     

    string[] stringArray = {...因为是从文件读取的,这里省略了...}
    List
    <string> listString =new List<string>();
    Array.Sort(stringArray );
    //排序数组
    int MaxLine = stringArray.Length;
    #region 单独计算第一个
    if (sourceData[0] != stringArray[1])
    {
    listString.Add(stringArray[
    0]);
    }
    #endregion
    for (int i =1; i < MaxLine; i++)
    {
    if (sourceData[i] != stringArray[i-1])
    {
    listString.Add(stringArray[i]);
    }
    }

    思路是:首先对数组进行排序,这样相同的数组就排列在了一起。然后遍历原数组,一次取出当前元素和上一个元素,如果2个元素相等就跳过,不相等就将其元素的保存到泛型listString中。(第一次运行的时候,前一个元素为空,所以把第一个元素单独拿出来处理)


    文章来自:   http://excellent.cnblogs.com/   

    本文版权归作者和博客园共同所有,欢迎大家转载,如有转载请注明



  • 相关阅读:
    day5 -常用模块
    day4装饰器-迭代器&&生成器
    h5 canvas 图片上传操作
    Tomcat上传文件报错:returned a response status of 403 Forbidden
    $.each遍历json对象
    Java求字符串中出现次数最多的字符
    线程池原理
    谈谈你对Hibernate的理解
    为什么要用 ORM? 和 JDBC 有何不一样?
    多线程有几种实现方法?同步有几种实现方法?(被问到)
  • 原文地址:https://www.cnblogs.com/Excellent/p/1935768.html
Copyright © 2020-2023  润新知