다음 알고리즘이 중단되지 않는 이유는 무엇입니까? (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;
}