2011-03-15 17 views
5

Buscando la mejor manera de hacerlo en VB6. Por lo general, me gustaría utilizar este enfoque ...Recuento de ocurrencias de un carácter en una cadena

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

¿Quieres contar con espacios o caracteres distintos? –

+1

¿Qué pasa con ese enfoque? – Beth

+2

¿Está buscando contar caracteres únicos o caracteres específicos? Su título sugiere "único", su muestra sugiere "específico". – mwolfe02

Respuesta

1

me gustaría utilizar un cubo modificado para ordenar:

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 

... y su resultado está en count. El rendimiento es O (N) - si Mid$ es O (1).

Editar:

Sobre la base de su aclaración, haga lo siguiente:

' 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 

como ASCII compara tiene que ser más rápido que la comparación de cadenas. Lo describiría por si acaso, pero estoy bastante seguro.

+0

Muy buena respuesta! A pesar de que no mencioné ASCII como un requisito, me gusta la idea de limitar mi búsqueda a un rango de caracteres específico. Resulta que mi problema encajaría bien con esta solución. –

+0

Supongo que 'AscW' será aún más rápido, ya que las cadenas VB6 son internamente Unicode – MarkJ

14

No decir que es la mejor manera, pero que hacer código:

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

Me gusta el enfoque escueto en esta respuesta. –

+0

Esto se convirtió en una mejor respuesta una vez que la pregunta cambió. :) –

+0

hermoso ejemplo de duct-tape-programming (https://www.joelonsoftware.com/2009/09/23/the-duct-tape-programmer/). Me gusta mucho. –

0

No está claro lo que quiere decir con mejor forma para hacer esto.

Si quieres algo muy rápido, pero totalmente imposible de mantener, adaptar esta horrible code que ahonda en la memoria subyacente de una cadena de VB6 para contar el número de palabras. Cortesía de VBspeed.

5

utilizar el comando de división como este

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 

Se puede combinar con una sola línea.

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

Hice un tiempo crudo en él. En una cadena de 40,000 caracteres con todos los espacios, parece sincronizarse a los 17 milisegundos en un procesador Intel Core 2 de 2,4 GHz.

Una función podría tener este aspecto

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

Me gustó esta respuesta también. Si pudiera aceptar dos respuestas para una pregunta, también aceptaría su respuesta. –

+0

Solución mucho más elegante que la aceptada. – Stanton

Cuestiones relacionadas