Подсчет вхождений символа в строку - PullRequest
5 голосов
/ 15 марта 2011

В поисках лучшего способа сделать это в VB6. Как правило, я бы использовал этот подход ...

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

Ответы [ 4 ]

16 голосов
/ 15 марта 2011

Не говорю, что это лучший способ, но вы делаете код:

distinctChr = " "
count = Len(text) - Len(Replace(text, distinctChr , ""))
5 голосов
/ 15 марта 2011

Используйте команду разделения следующим образом

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"))

Я сделал несколько грубых попыток. Для строки длиной 40000 символов со всеми пробелами она, по-видимому, работает с тактовой частотой 17 миллисекунд на процессоре Intel Core 2 с частотой 2,4 ГГц.

Функция может выглядеть следующим образом

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
1 голос
/ 15 марта 2011

Я бы использовал модифицированную сортировку сегментов:

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 голосов
/ 15 марта 2011

Непонятно, что вы имеете в виду под лучшим способом сделать это.

Если вам нужно что-то очень быстрое, но полностью не поддерживаемое, адаптируйте этот ужасный код , который копается в основной памяти строки VB6 для подсчета числа слов. Предоставлено VBspeed .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...