IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

compter nombre d'occurence dans un String


Sujet :

Collection et Stream Java

  1. #1
    Membre actif Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Points : 209
    Points
    209
    Par défaut compter nombre d'occurence dans un String
    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

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par 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 :

    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

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    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++

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    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

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre actif Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Points : 209
    Points
    209
    Par défaut
    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


    ++

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Des nouvelles de chez Java? lol

    Cette fonction m'intéresse grandement aussi, et si je peux éviter mes boucles, ce serait intéressant!

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par profete162 Voir le message
    Des nouvelles de chez Java? lol
    Pas d'implém' toute faite, en tout cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Février 2006
    Messages : 49
    Points : 33
    Points
    33
    Par défaut
    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);

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Février 2006
    Messages : 49
    Points : 33
    Points
    33
    Par défaut
    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);
    c'est un peu mieux comme ça je pense

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par le y@m's Voir le message
    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;
    }
    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

    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;
        }
    Mais ensuite je n'arrive pas à compter le nombre d'occurrence à partir de cette fonction.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    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.

  12. #12
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    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++

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    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

    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;
    }
    Une idée?

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    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 ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/07/2008, 03h16
  2. [SQL] Compter le nombre d'occurences dans une table par valeur
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2008, 17h22
  3. Compter le nombre d'occurence dans un tableau
    Par titou250 dans le forum Excel
    Réponses: 2
    Dernier message: 08/01/2008, 16h25
  4. Compter le nombre d'occurence dans une chaine
    Par shirya dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2007, 20h39
  5. [AS] Nombre d'occurences dans une string
    Par frol dans le forum Flash
    Réponses: 3
    Dernier message: 26/12/2005, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo