zoukankan      html  css  js  c++  java
  • ASP.NET从字符串中查找字符出现次数的方法

    今天在一场“特殊的讨论”中引入了一个问题,如何在C#求出字符串中某字符的出现次数,比如求“ADSFGEHERGASDF”中“A”出现的次数。首先想到的方法当然是从头遍历字符串并统计:
    程序代码
    c1=0;
    for(inti=0;i {
    if(str[i]==.A.)
    {
    c1++;
    }
    }
    第二种方法也很容易想到,将字符串中所有要查找的字符去除,然后比较去除前后的字符串长度即可。这种方法遭到了某人的鄙视,据说性能很差而且多占空间。
    程序代码
    c2=str.Length-str.Replace("A",String.Empty).Length;
    接下来某人又提出了第三种方法,是用要查找的字符为分隔符,将原字符串分隔为多个子串,然后求子串的数目即可。在C#中这是一个写起来很短的方法:
    程序代码
    c3=str.Split(newchar[]{.A.}).Length-1;
    我们从原理可以推断出三者性能的顺序,但究竟差距是多少呢,还是要动手试验一下。这是非常经典的测试代码:
    程序代码
    stringstr="SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA";
    Stopwatchsw=newStopwatch();
    longt;
    intc=0;
    GC.Collect();
    Application.DoEvents();
    sw.Start();
    for(inti=0;i<100000;i++)
    {
    c=三种算法
    }
    sw.Stop();
    t=sw.ElapsedMilliseconds;
    首先我们确保正确性,经测试三种方法都能正确处理多种情况,包括首尾、连续出现、不出现或串长度为0等,我所取的字符串是一个很普通的串。编译为Release版,预运行10次后获得以下结果:
    遍历统计:13毫秒
    替换后比较长度:112毫秒
    断开字符串后计数:233毫秒
    这里已经体现出差异,遍历统计比替换后比较要快10倍,断开字符串又要慢一些。接下来我又做了如下两个测试:
    1、不改变字符串的长度,增加或减少要查找字符串的个数。
    2、不改变要查找字符出现的频率,但增长字符串的长度。
    结果发现,三种方法都随字符串长度增加线性变慢,而后两种方法还随要查找的字符增加而变慢。

    转自:娃酷分类网 http://www.waaku.com 原文地址:http://www.waaku.com/InfoView124056.html


    作者:水木    
     
  • 相关阅读:
    海尔U+的启发:让用户对智能家居拥有“话语权”
    关于hash和ico的一些关联
    二维码简单介绍
    卡特兰数 大数模板
    C++ Linux 多线程之创建、管理线程
    Objective-c开发教程--MRC和ARC混编
    APP 打包測试流程 从零開始
    hdu4848 求到达每一个点总时间最短(sum[d[i]])。
    表结构变更后出现的ERROR OGG-01161 Bad column index (88)
    【Linux学习】Ubuntu下内核编译(一)
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1669729.html
Copyright © 2011-2022 走看看