[Java] Vorkommen von Teilstrings in einem String


Answers

Wie wäre es mit StringUtils.countMatches von Apache Commons Lang?

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

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

Das ergibt:

3
Question

Warum stoppt der folgende Algorithmus nicht für mich? (str ist die Zeichenfolge, in der ich suche, findStr ist die Zeichenfolge, die ich suche)

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

EDIT- aktualisiert, funktioniert immer noch nicht




Sie können die Anzahl der Vorkommen mit der integrierten Bibliotheksfunktion angeben:

import org.springframework.util.StringUtils;
StringUtils.countOccurrencesOf(result, "R-")



Auf der Grundlage der vorhandenen Antwort (en) möchte ich eine "kürzere" Version ohne das if hinzufügen:

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

int count = 0, lastIndex = 0;
while((lastIndex = str.indexOf(findStr, lastIndex)) != -1) {
    lastIndex += findStr.length() - 1;
    count++;
}

System.out.println(count); // output: 3



Versuchen Sie, lastIndex+=findStr.length() am Ende Ihrer Schleife hinzuzufügen, sonst landen Sie in einer Endlosschleife, weil Sie, sobald Sie den Teilstring gefunden haben, versuchen, ihn von der gleichen letzten Position aus wiederzufinden.




Erhöhen Sie lastIndex wenn Sie nach dem nächsten Vorkommen suchen.

Ansonsten findet es immer den ersten Teilstring (an Position 0).




Hier ist es, eingepackt in eine schöne und wiederverwendbare Methode:

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



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

am Ende der Schleife ist die Anzahl 3; ich hoffe es hilft




Die Antwort, die als richtig angegeben wird, ist nicht gut zum Zählen von Dingen wie Zeilenrückgaben und ist viel zu ausführlich. Spätere Antworten sind besser, aber alle können einfach mit erreicht werden

str.split(findStr).length

Mit dem Beispiel in der Frage werden keine nachfolgenden Übereinstimmungen gelöscht.




Müssen Sie das Matching wirklich selbst regeln? Vor allem, wenn Sie nur die Anzahl der Vorkommen brauchen, sind reguläre Ausdrücke aufgeräumter:

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



Hier ist die andere Lösung ohne regexp / patterns / matchers oder gar nicht mit StringUtils.

String str = "helloslkhellodjladfjhelloarunkumarhelloasdhelloaruhelloasrhello";
        String findStr = "hello";
        int count =0;
        int findStrLength = findStr.length();
        for(int i=0;i<str.length();i++){
            if(findStr.startsWith(Character.toString(str.charAt(i)))){
                if(str.substring(i).length() >= findStrLength){
                    if(str.substring(i, i+findStrLength).equals(findStr)){
                        count++;
                    }
                }
            }
        }
        System.out.println(count);



Hier ist die erweiterte Version zum Zählen, wie oft das Token in einer vom Benutzer eingegebenen Zeichenfolge aufgetreten ist:

public class StringIndexOf {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Enter a sentence please: \n");
        String string = scanner.nextLine();

        int atIndex = 0;
        int count = 0;

        while (atIndex != -1)
        {
            atIndex = string.indexOf("hello", atIndex);

            if(atIndex != -1)
            {
                count++;
                atIndex += 5;
            }
        }

        System.out.println(count);
    }

}