Warum hält der folgende Algorithmus für mich nicht an? (str ist die Zeichenfolge, in der ich suche, findStr ist die Zeichenfolge, die ich zu finden versuche)
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);
Antworten:
Die letzte Zeile verursachte ein Problem.
lastIndex
würde niemals bei -1 sein, also würde es eine Endlosschleife geben. Dies kann behoben werden, indem die letzte Codezeile in den if-Block verschoben wird.quelle
Wie wäre es mit StringUtils.countMatches von Apache Commons Lang?
Das gibt aus:
quelle
StringUtils
hat keinecountMatches
Methode.Ihr
lastIndex += findStr.length();
wurde außerhalb der Klammern platziert, was eine Endlosschleife verursachte (wenn kein Vorkommen gefunden wurde, war lastIndex immer zufindStr.length()
).Hier ist die feste Version:
quelle
Eine kürzere Version. ;)
quelle
return haystack.split(Pattern.quote(needle), -1).length - 1;
wenn zum Beispielneedle=":)"
,-1
werden nachfolgende Übereinstimmungen gelöscht .Müssen Sie das Matching wirklich selbst erledigen? Besonders wenn Sie nur die Anzahl der Vorkommen benötigen, sind reguläre Ausdrücke aufgeräumter:
quelle
String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
Pattern.compile("hel\\+lo");
dem+
Zeichen hat eine besondere Bedeutung in einem regulären Ausdruck und muss maskiert werden.Pattern.quote(str)
ist dies Ihr Freund!Ich bin sehr überrascht, dass niemand diesen einen Liner erwähnt hat. Es ist einfach, prägnant und bietet eine etwas bessere Leistung als
str.split(target, -1).length-1
quelle
Hier ist es, eingepackt in eine schöne und wiederverwendbare Methode:
quelle
am Ende der Schleife beträgt die Anzahl 3; ich hoffe es hilft
quelle
findStr.length() - 1
gibt das 0 zurück und wir befinden uns in einem endlosen Zyklus.Viele der gegebenen Antworten schlagen bei einer oder mehreren der folgenden fehl:
Folgendes habe ich geschrieben:
Beispielaufruf:
Wenn Sie eine Suche mit nicht regulären Ausdrücken wünschen, kompilieren Sie Ihr Muster einfach entsprechend mit dem
LITERAL
Flag:quelle
quelle
replace
, nichtreplaceAll
.Zuwachs
lastIndex
Sie, wann immer Sie nach dem nächsten Auftreten suchen.Andernfalls wird immer der erste Teilstring gefunden (an Position 0).
quelle
Gibt den Index innerhalb dieser Zeichenfolge des ersten Vorkommens des angegebenen Zeichens zurück und startet die Suche am angegebenen Index.
Ihr
lastindex
Wert ist also immer 0 und er findet immer Hallo in der Zeichenfolge.quelle
Die als richtig gegebene Antwort eignet sich nicht zum Zählen von Zeilenrückläufen und ist viel zu ausführlich. Spätere Antworten sind besser, aber alles kann einfach mit erreicht werden
Nach dem Beispiel in der Frage werden keine nachfolgenden Übereinstimmungen gelöscht.
quelle
Sie können die Anzahl der Vorkommen mithilfe der integrierten Bibliotheksfunktion festlegen:
quelle
Versuchen Sie
lastIndex+=findStr.length()
, am Ende Ihrer Schleife etwas hinzuzufügen , da Sie sonst in einer Endlosschleife landen, da Sie, sobald Sie den Teilstring gefunden haben, versuchen, ihn immer wieder von derselben letzten Position aus zu finden.quelle
Probier diese. Es ersetzt alle Übereinstimmungen durch a
-
.Und wenn Sie Ihre nicht zerstören möchten, können
str
Sie eine neue Zeichenfolge mit demselben Inhalt erstellen:Nach dem Ausführen dieses Blocks sind dies Ihre Werte:
quelle
Wie @Mr_and_Mrs_D vorgeschlagen hat:
quelle
Basierend auf den vorhandenen Antworten möchte ich eine "kürzere" Version ohne das if hinzufügen:
quelle
Hier ist die erweiterte Version zum Zählen, wie oft das Token in einer vom Benutzer eingegebenen Zeichenfolge aufgetreten ist:
quelle
Die folgende Methode zeigt, wie oft sich Teilzeichenfolgen auf Ihrer gesamten Zeichenfolge wiederholen. Hoffe, Sie voll zu nutzen: -
quelle
Hier ist die andere Lösung, ohne Regexp / Patterns / Matcher zu verwenden oder StringUtils nicht zu verwenden.
quelle
Wenn Sie den Index jeder Teilzeichenfolge in der ursprünglichen Zeichenfolge benötigen, können Sie mit indexOf Folgendes tun:
quelle
}}
quelle
Diese Lösung gibt die Gesamtzahl des Auftretens eines bestimmten Teilstrings in der gesamten Zeichenfolge aus und schließt auch die Fälle ein, in denen überlappende Übereinstimmungen vorhanden sind.
quelle