[java] 문자열에서 하위 문자열의 발생

다음 알고리즘이 중단되지 않는 이유는 무엇입니까? (str은 내가 검색하는 문자열이고, findStr은 내가 찾으려는 문자열입니다)

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



답변

마지막 줄은 문제를 일으켰습니다. lastIndex-1이 아니므로 무한 루프가 있습니다. 코드의 마지막 줄을 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);


답변

Apache Commons Lang에서 StringUtils.countMatches 를 사용하는 것은 어떻 습니까?

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

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

그 결과 :

3


답변

귀하가 lastIndex += findStr.length();어떤 선두로부터이 발견되지 때 무한 루프 (원인, 괄호 외부에 배치 된, lastIndex 속성은 항상 있었다findStr.length() ).

다음은 고정 버전입니다.

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


답변

더 짧은 버전. 😉

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


답변

당신은 정말 스스로 매칭을 처리해야합니까? 특히 필요한 것이 발생 횟수뿐이라면 정규식이 더 깔끔합니다.

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


답변

아무도이 라이너를 언급하지 않았다는 것이 매우 놀랍습니다. 간단하고 간결하며str.split(target, -1).length-1

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


답변

여기에 멋지고 재사용 가능한 방법으로 싸여 있습니다.

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