程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET從字符串中查找字符出現次數的方法

ASP.NET從字符串中查找字符出現次數的方法

編輯:.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、不改變要查找字符出現的頻率,但增長字符串的長度。

結果發現,三種方法都隨字符串長度增加線性變慢,而後兩種方法還隨要查找的字符增加而變慢。

.

斷開字符串的方法還受要查找字符串分布情況的影響。

研究Replace函數和Split函數的實現可以徹底解決這個問題。不過我沒有心情細細研究了,我還是決定選用第二種方法——替換後比較長度。雖然其速度比第一種方法慢,但易於改寫為求長度不為1的子串出現次數的方法。第一種方法若改為求長度大於1的字串就要考慮很多因素(盡管不一定真的很麻煩),我懶得想了,呵呵。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved