我冻结了以下代码,用于计算字符串中字符的出现次数:
public static void main(String[] args) {
String source = "hello low how ale you";
Scanner in = new Scanner(System.in);
String temp = in.nextLine();
char test = temp.toCharArray()[0];
int fromIndex = 0;
int occurences =0;
while(fromIndex>-1)
{
fromIndex = source.indexOf(test, fromIndex);
System.out.println("found at"+fromIndex);
//if(fromIndex!=-1) occurences++;
}
System.out.println(occurences);
}
如果“if(fromIndex!= - 1)”行被注释掉,循环无限运行!
如果取消注释相同的行,则循环正确终止。
观察循环的终止取决于变量fromIndex
,而不是在If块内更新的变量occurences
的更新,这很奇怪。
有关为何发生这种情况的任何猜测?
答案 0 :(得分:0)
我认为你正在尝试做类似下面的事情。
public class Solution {
public static void main(String[] args) {
String source = "hello low how ale you";
char test = 'u';
int fromIndex = 0;
int occurrences = 0;
int length = source.length();
while (fromIndex < length) {
int index = source.indexOf(test, fromIndex);
if (index != -1) {
occurrences++;
fromIndex = index;
}
fromIndex++;
}
System.out.println(occurrences);
}
}
一些解释 -
fromIndex
初始化将为0。fromIndex < length
。index
。index
不是-1,请将其分配给fromIndex
。因为您现在将从此位置开始搜索。不是从0开始。fromIndex
。无论index
变量的值如何,都将执行此操作。
答案 1 :(得分:0)
如果您不严格使用代码中的方法,我建议您使用正则表达式。你也会有更清洁,更少的代码。试试下面的代码段,假设您有字符ch
:
char ch = 'o';
String input = "Hi there boys! Come on!";
String regex = ch + "";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
ArrayList<String> matches = new ArrayList<String>();
while (m.find())
matches.add(m.group());
System.out.println(matches.size());
答案 2 :(得分:0)
fromIndex值在后续迭代中不会改变。这就是无限循环背后的原因。因为fromIndex会给出字符的确切索引。对于下一个循环,将fromIndex增加1,这将解决问题。
while(fromIndex>-1)
{
fromIndex = source.indexOf(test, fromIndex+1);
System.out.println("found at"+fromIndex);
if(fromIndex!=-1) occurences++;
}
}
希望这有帮助。