166 votes

Occurrences de la sous-chaîne dans une chaîne de caractères

Pourquoi l'algorithme suivant ne s'arrête-t-il pas pour moi ? (str est la chaîne dans laquelle je cherche, findStr est la chaîne que j'essaie de trouver)

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while (lastIndex != -1) {
    lastIndex = str.indexOf(findStr,lastIndex);

    if( lastIndex != -1)
        count++;

    lastIndex += findStr.length();
}

System.out.println(count);

233voto

A_M Points 2897

Et si vous utilisiez StringUtils.countMatches de Apache Commons Lang ?

String str = "helloslkhellodjladfjhello";
String findStr = "hello";

System.out.println(StringUtils.countMatches(str, findStr));

Ces sorties :

3

137voto

Olivier Points 1501

Votre lastIndex += findStr.length(); était placé en dehors des parenthèses, ce qui provoquait une boucle infinie (lorsqu'aucune occurrence n'était trouvée, lastIndex était toujours à findStr.length() ).

Voici la version corrigée :

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while (lastIndex != -1) {

    lastIndex = str.indexOf(findStr, lastIndex);

    if (lastIndex != -1) {
        count++;
        lastIndex += findStr.length();
    }
}
System.out.println(count);

109voto

Peter Lawrey Points 229686

Une version plus courte. ;)

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
System.out.println(str.split(findStr, -1).length-1);

91voto

codebreach Points 403

La dernière ligne créait un problème. lastIndex ne serait jamais à -1, il y aurait donc une boucle infinie. Ce problème peut être résolu en déplaçant la dernière ligne de code dans le bloc if.

String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;

while(lastIndex != -1){

    lastIndex = str.indexOf(findStr,lastIndex);

    if(lastIndex != -1){
        count ++;
        lastIndex += findStr.length();
    }
}
System.out.println(count);

83voto

Jean Points 9655

Devez-vous vraiment vous occuper vous-même de la correspondance ? Surtout si tout ce dont vous avez besoin est le nombre d'occurrences, les expressions régulières sont plus ordonnées :

String str = "helloslkhellodjladfjhello";
Pattern p = Pattern.compile("hello");
Matcher m = p.matcher(str);
int count = 0;
while (m.find()){
    count +=1;
}
System.out.println(count);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X