7
votes

Compter les occurrences d'un personnage dans une chaîne

À la recherche de la meilleure façon de le faire dans VB6. En règle générale, j'utiliserais cette approche ...

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

vb6

11 commentaires

Voulez-vous compter des espaces ou des caractères distincts?


Quel est le problème avec cette approche?


Alors cherchez-vous à compter des caractères uniques ou des caractères spécifiques? Votre titre suggère "unique", votre échantillon suggère "spécifique".


La seule chose que j'ajouterais est de déplacer le len (texte) en dehors de le pour, le sauver dans une variable.


@xanatos - VB6 Strings sont stocké au format BSTR , donc la fonction de longueur est O ( 1), donc ce n'est qu'une optimisation mineure. Le compilateur l'obtiendrait probablement.


Je veux compter un caractère spécifique dans une chaîne, même si mon exemple utilise un espace.


@Scott je savais, mais vous ne pouvez pas optimiser beaucoup d'autre du code :-) sauf si le nombre ou le texte est une variante :-) :-)


@Xanatos - True, bien qu'il soit probablement plus rapide de comparer les valeurs ASCII que des chaînes littérales. De plus, le commentaire de l'auteur vient de changer la nature de la question ... ARG


Pour répondre à la question de Beth, je suis récemment passé d'être membre d'une équipe de Dev de taille moyenne pour être un loup solitaire responsable de conserver un projet. Avoir des gens intelligents manquent de revoir ma solution à un problème. J'aime apprendre d'autres personnes. Stackoverflow est un excellent substitut!


@xanatos @scott VB n'évalue que l'expression à une fois de toute façon. C'est un pour boucle, pas un faire pendant boucle.


@ Garykindel: J'ai changé votre titre de question, le titre et ce que vous demandez réellement ne correspondent pas.


4 Réponses :


19
votes

Ne pas dire que c'est le meilleur moyen, mais vous codez:

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


3 commentaires

J'aime l'approche terrese sur cette réponse.


Ceci est devenu une meilleure réponse une fois la question modifiée. :)


Bel exemple de programmation de canaux ( Joelonsoftware.com/ 2009/09/23 / le programmeur-gamme de canaux ). Je l'aime beaucoup.



1
votes

Je voudrais utiliser un type de godet modifié: xxx pré>

... et votre résultat est dans compte code>. La performance est O (n) - si MID $ code> est O (1). P>

EDIT STRY>: P>

Basé sur votre Clarification, faites ceci: p>

   ' 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


2 commentaires

Très belle réponse! Même si, je n'ai pas précisé ASCII comme une exigence, j'aime l'idée de limiter ma recherche une gamme de caractères spécifique. Souvent mon problème correspond à cette solution bien.


Je suppose que ascw sera encore plus rapide, car les chaînes VB6 sont unicode



0
votes

Ce n'est pas clair ce que vous entendez par le meilleur comment faire cela.

Si vous voulez quelque chose très rapide, mais totalement immeuble, adaptez ce code horrible qui figure dans la mémoire sous-jacente d'une chaîne VB6 pour compter le nombre de mots. Courtesy de VBSpeed ​​.


0 commentaires

6
votes

Utilisez la commande fractionnée comme celle-ci

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 commentaires

J'ai aussi aimé cette réponse. Si je pouvais accepter deux réponses pour une question, j'accepterais aussi votre réponse.