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);

57voto

kmecpp Points 1062

Je suis très surpris que personne n'ait mentionné ce one liner. Il est simple, concis et fonctionne un peu mieux que str.split(target, -1).length-1

public static int count(String str, String target) {
    return (str.length() - str.replace(target, "").length()) / target.length();
}

14voto

SecretService Points 1469

Le voici, emballé dans une méthode agréable et réutilisable :

public static int count(String text, String find) {
        int index = 0, count = 0, length = find.length();
        while( (index = text.indexOf(find, index)) != -1 ) {                
                index += length; count++;
        }
        return count;
}

8voto

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

while((lastIndex = str.indexOf(findStr, lastIndex)) != -1) {
     count++;
     lastIndex += findStr.length() - 1;
}
System.out.println(count);

à la fin de la boucle, le compte est de 3 ; j'espère que cela vous aidera.

8voto

Maksym Ovsianikov Points 344
public int countOfOccurrences(String str, String subStr) {
  return (str.length() - str.replaceAll(Pattern.quote(subStr), "").length()) / subStr.length();
}

7voto

benkc Points 623

Un grand nombre des réponses données échouent sur un ou plusieurs points :

  • Motifs de longueur arbitraire
  • les correspondances qui se chevauchent (comme le fait de compter "232" dans "23232" ou "aa" dans "aaa").
  • Méta-caractères des expressions régulières

Voici ce que j'ai écrit :

static int countMatches(Pattern pattern, String string)
{
    Matcher matcher = pattern.matcher(string);

    int count = 0;
    int pos = 0;
    while (matcher.find(pos))
    {
        count++;
        pos = matcher.start() + 1;
    }

    return count;
}

Exemple d'appel :

Pattern pattern = Pattern.compile("232");
int count = countMatches(pattern, "23232"); // Returns 2

Si vous souhaitez une recherche par expression non régulière, il suffit de compiler votre motif de manière appropriée avec la commande LITERAL drapeau :

Pattern pattern = Pattern.compile("1+1", Pattern.LITERAL);
int count = countMatches(pattern, "1+1+1"); // Returns 2

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