Chaine de caractere, comptage occurence [Résolu]

Signaler
Messages postés
16
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
21 décembre 2009
-
 Toto -
Bonjour j’aimerai écrire une fonction qui indique le nombre d'occurrences du caractère c dans la chaîne s.en C#<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





 





Je voudrais une boucle qui examine chaque lettre et qui compte le nombre de lettres trouvées.





En theorie je sais faire mais en pratique..





 





Merci de votre aide





 






 

10 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
salut

Voilà ta fonction

int nbChar(string chaine, char lettre)
{
    int nb = 0;
    foreach (char c in chaine)
    {
        if (c == lettre) nb++;
    }
    return nb;
}

Krimog :
while (!succeed = try()) ;
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
cette methode n'est pas meilleure que celle de krimog mais juste diférent si tu veux "kikooter" un peu ^^:

private int NbChar(string chaine, char occurence, bool invariant)
{
    if(invariant)
      return chaine.ToLowerInvariant().ToCharArray().Count(p => p == occurence);
    else
      return chaine.ToCharArray().Count(p => p == occurence);
}

Et en bonus en passant true en dernier parametre de ta fonction tu ne tiens pas compte de la casse, en passant false tu tiens compte de la casse
Messages postés
16
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
21 décembre 2009

Merci bien.
Me voilà avec 2 versions différentes et 2 fois plus de connaissances

je reviendrais !
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Voici ma modeste contribution...

private
int CountPattern(
string input,
string pattern,
bool invariant)
{
  
return
Regex.Matches(input, pattern, invariant ?
RegexOptions.None :
RegexOptions.IgnoreCase).Count;
}

<hr />
-Blog-
-Site Perso-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Bon bah je crois qu'on a tout fait là, non ?
Ah non, on peut Split() la chaine sur ce caractère et Count() la taille du tableau retourné :-)

Krimog :
while (!succeed = try()) ;
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Moui, cependant c'est la première solution la meilleure en terme de performance...
Les autres (surtout la mienne) sont trop lente pour ce cas précis.

<hr />
-Blog-
-Site Perso-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Je me demande si la tienne n'est pas plus rapide dans le cas d'un très grand string. Généralement, les expressions régulières c'est assez bluffant comme perfs.

Krimog :
while (!succeed = try()) ;
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Les regex permettent d'économiser beaucoup de ligne de code (qui peuvent être assez fastidieuses à écrire).
Si on maitrise bien la chose, on peut écrire des expressions assez complexe en très peu de caractères.

Par contre niveau performance, c'est pas forcément le pied, surtout pour les petits textes.
Avec de gros texte, en mode compiler, c'est probablement là qu'on a les meilleurs résultats mais je n'irais pas jusqu' à dire qu'on a des performances bluffantes...

Maintenant ça dépend aussi du genre de pattern qu'on utilise. Dans mon précédant message, comme je l'ai indiqué, je me base sur l'exemple poser dans la question. Et la, les regex peuvent pas faire grand chose.

<hr />
-Blog-
-Site Perso-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Pour une chaîne de 200'000 caractères, sans la possibilité de mettre un bool invariant.
J'obtient ceci:

1) Boucle sur chaque char - 21'652
2) ToCharArray - 150'862
3) Regex - 1'417'887

1'000'000 de caractères

1) Boucle sur chaque char - 115'516
2) ToCharArray - 594'700
3) Regex - 4'922'910

C'est vite vu...

<hr />
-Blog-
-Site Perso-
Le plus simple et le plus rapide est d'utiliser les requêtes Linq :
chaine.Count(n => n == 'c')