我正在尝试计算某个字符串在另一个字符串中出现的实例数。我正在搜索的输入字符串没有以任何方式格式化。
我目前正在进行以下操作,但很明显它只计算一次.contains。什么是多次计算实例的最有效方法。
public String computeBestFitKey() {
if(this.inputText == null)
return null;
String answer = null;
int bestCount = 0, tempCount = 0;
for(String s: logicTemplate.getLogicMap().keySet()) {
String[] keyWords = this.logicTemplate.getKeyWords(s);
for(String word: keyWords) {
if(this.inputText.toLowerCase().contains(word.toLowerCase())) {
System.out.println("word found: "+word.toLowerCase());
tempCount++;
}
}
if(tempCount > bestCount) {
bestCount = tempCount;
answer = s;
}
tempCount = 0;
}
return answer;
}
答案 0 :(得分:1)
您应该使用indexOf(string str, int startFrom)
。
替换此行:if(this.inputText.toLowerCase().contains(word.toLowerCase())) {
有了这些:
int lastIndex = -1;
String lowerTextInput = this.inputText.toLowerCase();
String lowerWord = word.toLowerCase();
while((lastIndex = (lowerTextInput .indexOf(lowerWord , lastIndex + 1)) > 0)
这样做的是它为你的子字符串赋值lastIndex
。如果字符串不包含子字符串,则它将产生-1,因此while
条件将中断。如果确实存在,lastIndex
的值将增加1并再次进行搜索。
如果您想对此进行一些改进,尤其是在搜索大字符串时,我建议您将lastIndex
的值增加您匹配的子字符串的长度。
答案 1 :(得分:1)
如果您只需要计算一个单词的出现次数,并且它不是您被限制使用某些标准设施的家庭作业,那么您可以这样做
int numOccurrences = 0;
Matcher m = Pattern.compile(word, Pattern.LITERAL).matcher(input);
while (m.find()) numOccurrences++;
Pattern.LITERAL
用于字面处理所有字符,并忽略其在正则表达式中的特殊含义(如果有)。
答案 2 :(得分:0)
static int countOccurences(String haystack, String needle)
{
int index, lastIndex = -1, count = 0;
while ((index = haystack.indexOf(needle, lastIndex + 1)) != -1)
{
lastIndex = index;
++count;
}
return count;
}