2011-03-15 502 views
5

尋找在VB6中執行此操作的最佳方式。通常情況下,我會用這種方法...計算字符串中字符的出現次數

' count spaces 
    For i = 1 To Len(text) 
     If Mid$(text, i, 1) = " " Then count = count + 1 
    Next 
+1

你想指望空格或不同的角色? – 2011-03-15 16:27:52

+1

這種方法有什麼問題? – Beth 2011-03-15 16:28:10

+2

那麼你想要計算獨特的人物或特定的人物?你的標題顯示'獨特',你的樣本建議'具體'。 – mwolfe02 2011-03-15 16:28:26

回答

1

我會使用修改後的桶排序:

Dim i as Integer 
Dim index As Integer 
Dim count as Integer 
Dim FoundByAscii(0 To 255) As Boolean 
For i = 1 To Len(text) 
    index = Asc(Mid$(text, i, 1)) 
    FoundByAscii(index) = True 
Next i 
count = 0 
For i = 0 To 255 
    If FoundByAscii(i) Then 
     count = count + 1 
    End If 
Next i 

...而你的結果在count。性能是O(N) - 如果Mid$是O(1)。

編輯

根據您的澄清,這樣做:

' count spaces 
    Dim asciiToSearchFor As Integer 
    asciiToSearchFor = Asc(" ") 
    For i = 1 To Len(text) 
     If Asc(Mid$(text, i, 1)) = asciiToSearchFor Then count = count + 1 
    Next 

爲ASCII比較得更快一些字符串比較。我只是爲了以防萬一,但我很確定。

+0

非常好的答案!儘管如此,我沒有聲明ASCII是一項要求,但我喜歡將搜索限制在特定字符範圍內的想法。原來我的問題很適合這個解決方案。 – 2011-03-15 16:54:55

+0

我猜'AscW'會更快,因爲VB6字符串在內部是Unicode – MarkJ 2011-03-15 17:34:14

14

不是說這是最好的方式,但你的代碼做:

distinctChr = " " 
count = Len(text) - Len(Replace(text, distinctChr , "")) 
+2

我喜歡這個答案的簡潔方法。 – 2011-03-15 16:49:03

+0

一旦問題發生變化,這成爲更好的答案。 :) – 2011-03-17 16:40:45

+0

管道磁帶編程的美麗例子(https://www.joelonsoftware.com/2009/09/23/the-duct-tape-programmer/)。很喜歡它。 – 2017-02-14 18:06:07

0

目前尚不清楚你的意思是最好是這樣做的方法。

如果你想要的東西非常快,但完全難以維護,適應這個horrible code是深入到一個字符串,VB6的底層內存來算話的人數。感謝VBspeed

5

使用split命令這樣

Dim TempS As String 
TempS = " This is a split test " 
Dim V As Variant 
V = Split(TempS, " ") 
Cls 
Print UBound(V) '7 
V = Split(TempS, "i") 
Print UBound(V) '3 
V = Split(TempS, "e") 
Print UBound(V) '1 

您可以將其組合成一條線。

Print UBound(Split(TempS, "i")) 

我做了一些粗糙的時機。在具有所有空間的40,000個字符的字符串中,它似乎在2.4 GHz Intel Core 2處理器上以17毫秒的速度輸入。

函數可能看起來像這樣

Function CountChar(ByVal Text As String, ByVal Char As String) As Long 
    Dim V As Variant 
    V = Split(Text, Char) 
    CountChar = UBound(V) 
End Function 
+0

我也喜歡這個答案。如果我能接受兩個問題的答案,我也會接受你的答案。 – 2011-03-15 18:39:53

+0

比公認的更優雅的解決方案。 – Stanton 2012-11-30 17:26:36

相關問題