bonjour,
Est ce qu'il existe une fonction toute faite pour compter le nobre d'occurence d'un mot dans une chaine de caractère (String)?
Cordialement,
L4BiN
bonjour,
Est ce qu'il existe une fonction toute faite pour compter le nobre d'occurence d'un mot dans une chaine de caractère (String)?
Cordialement,
L4BiN
Tu peut peut-être faire quelque chose avec les regex, mais je ne m'y connais pas assez, alors je te propose autre chose :Envoyé par L4BiN
il y a méthode index of qui permet de voir à quelle position se trouve un mot dans une chaine, ainsi, tu peut faire des indexOf jusqu'à ce qu'il te renvoie -1. Sans oublier bien sûr d'avancer le début du indexof à chaque fois bien sûr![]()
Salut,
Non pas en standard. Mais tu peux utiliser une boucle sur indexOf() ou les expressions régulières pour cela...
Ou sinon tu peux utiliser la méthode countMatches() de Jakarta Commons Lang.
a++
Perso, j'aime bien la solution avec les expressions régulières:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /** * Renvoie le nombre d'occurrences de la sous-chaine de caractères spécifiée dans la chaine de caractères spécifiée * @param text chaine de caractères initiale * @param string sous-chaine de caractères dont le nombre d'occurrences doit etre compté * @return le nombre d'occurrences du pattern spécifié dans la chaine de caractères spécifiée */ public static final int stringOccur(String text, String string) { return regexOccur(text, Pattern.quote(string)); } /** * Renvoie le nombre d'occurrences du pattern spécifié dans la chaine de caractères spécifiée * @param text chaine de caractères initiale * @param regex expression régulière dont le nombre d'occurrences doit etre compté * @return le nombre d'occurrences du pattern spécifié dans la chaine de caractères spécifiée */ public static final int regexOccur(String text, String regex) { Matcher matcher = Pattern.compile(regex).matcher(text); int occur = 0; while(matcher.find()) { occur ++; } return occur; }
Je ne répondrai à aucune question technique par MP.
Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
Enfin, quand une solution a été trouvée à votre problème pensez au tag :resolu:
Cours Dvp : http://ydisanto.developpez.com
Blog : http://yann-disanto.blogspot.com/
Page perso : http://yann-disanto.fr
merci a tous vous etes trop choux. J'avais penser que pe etre il existait une fonction pour cela. J'ai effectivement penser à boucler avec indexof alors c'est ce que je vai faire. Et j'ai un pote qui taff chez sun j lui demanderai de faire une nouvelle fonction dans l'API java pour les string
++
Des nouvelles de chez Java? lol
Cette fonction m'intéresse grandement aussi, et si je peux éviter mes boucles, ce serait intéressant!
Autre solution, découper la chaine sur le caractère voulu et compter le nombre d'occurrences. Il faut penser à soustraire 1 au résultat sauf si le caractère est présent en dernière position.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 String test = "-ab-cde-fgh-erg-"; String carac = "-"; int nbOccurs = test.endsWith(carac)? test.split("-").length : (test.split("-").length - 1);
c'est un peu mieux comme ça je pense
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 String test = "-ab-cde-fgh-erg-"; String carac = "-"; int nbOccurs = test.endsWith(carac)? test.split(carac).length : (test.split(carac).length - 1);
Salut,
Ca marche nickel mais il faut que le String recherché soit identique String contenu dans le texte, hors j'ai besoin d'avoir une fonction que ne prend pas en compte les accents, ni les majuscules/minuscules. Une idées?
J'avais trouvé une fonction qui permet de comparer 2 strings sans tenir des accents ni des Majuscules/minuscule
Mais ensuite je n'arrive pas à compter le nombre d'occurrence à partir de cette fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public boolean comparaison_string() { /* * Fonction de comparaison de 2 String sans tenir compte des Majuscules/Minuscules, ni des accents */ boolean identique = false; String chaine_a = "Mot Comparé", chaine_b = "moT compAre"; Collator compareOperator = Collator.getInstance(Locale.FRENCH); // Comparaison sans tenir compte des accents compareOperator.setStrength(Collator.PRIMARY); int result = compareOperator.compare(chaine_a, chaine_b); if (result == 0) { identique = true; } else { identique = false; } return identique; }
Ok en fait j ai trouvé une solution, le principe c'est d'utiliser la méthode STRING.indexOf(String str, int fromIndex) pour compter le nombre d'occurrence. Mais il faut avant convertir STRING et str en minuscule et sans accents avec toLowerCase() et voir ici pour supprimer les accents.
Salut,
Sauf erreur on ne peut pas faire de telle comparaison avec les regexps (mis à part pour ignorer les différences de majuscules/minuscules).
Une solution serait peut-être de supprimer tous les accents (cf la FAQ : Comment supprimer les accents d'une chaîne ?).
[edit] je n'avais pas vu ton message pendant que je tapais. La solution de la FAQ pour supprimer les accents est plus simple et plus complète (si tu as Java 6).
Par contre ce ne sera pas aussi précis que les Collators qui prennent en compte bien plus de chose spécifique aux locales (par exemple en français "oe" est égal à "œ", etc.).
Une autre solution pourrait être de passer par les RuleBasedCollator et la méthode getCollationElementIterator() qui retourne un iterateur sur les éléments de la chaine selon les conditions du collator...
On doit pouvoir en sortir une sorte d'indexOf() basé sur le Collator...
a++
Merci pour la réponse.
Ben en fait j ai un nouveau pb cad que j ai utilisé .indexOf() pour compter le nombre d'occurrence mais il me compte aussi les sous chaine de caractères. Je m'explique : je cherche le String "info" dans un texte et si ce dernier contient le mot "désinformation", alors la fonction indexOf() va me dire qu'elle a trouvé le mot info, ce qui ne me convient pas...
Même résultat avec le bout de code
Une idée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public static final int regexOccur(String text, String regex) { Matcher matcher = Pattern.compile(regex).matcher(text); int occur = 0; while(matcher.find()) { occur ++; } return occur; }
Bonjour à tous,
je dois faire le même type de fonction pour un serveur qui analyserait une page HTML, avec JSoup j'ai le texte brut ensuite
j'avais pensé à créer une classe qui extends Set
les statistiques seraient stockées dans une variable:
HashMap<String, Integer> statistics
le constructeur recevrait la String du texte en paramètre et ferait un toLowerCase()
ensuite un split() basé sur un espace ou autre
on obtiendrait une array String[] et faire un add de chaque entrée ou un addAll
Override la method add,
containsKey(k) retournerait true or false, incrémenter les stats dans statistics
Une instance de cette classe avec toutes les stats pourrait ainsi être passée en paramètre, stockée et réutilisée.
Juste une BIG question, serait ce valable niveau performance ?
Partager