这代码存在的问题,集中在循环代码块里(2个错误和1个没有遵循的规范); 我会在指出问题后,写出比较规范的参考代码;
1. 明显的错误: 第10行代码会出现下标越界异常 ;
因为str.substring(i,i+2) ;其中 当i+2大于了字符串的长度时,就会抛出该异常
解决办法: for (int i = 0; i < str.length()-1;i++ ) { //在for循环的条件里.i<str.length()-1.就可以了.
2. 隐藏错误: 思维逻辑上的错误.
比如在"AAA"中包含有几个字符串"AA" , 有的人说2 个. 有的人说1个;
其实这个争议的焦点是: 用过的字符串,能否再次被使用;
严谨的逻辑,就是用过的字符串, 不在使用了, 所以查找到子字符串了,那么下次查找就要跳过刚才的子字符串; 也就说"AAA"中"AA"出现的次数只有1次.
解决办法: 在count++;后面添加一行代码i=(i+2)-1;
3. 代码存在的其他问题: 违反了java开发手册,使用了太多的魔法值(未经定义的常量)
比如 i+2 ;这里的2代表什么含义? 为什不是i+1或者i+3?
当然了慢慢读代码会知道i+2;代表的是i+"字符".length(); 但是阅读起来太麻烦.下次要查找的字符串不是2个字符,而是3个字符. 那么又需要频繁的修改
参考代码1:(使用while循环: 推荐该方法,循环次数较少)
public class Test1 {
public static void main(String[] args) {
String str = "字符串对象创建后不能对该字符串的字符做修改字符"; //字符串
String keyWords = "字符"; //需要寻找的关键字
int fromIndex = 0;//搜索的下标
int count = 0;//关键字出现的次数
//str.indexOf(KeyWords,fromIndex)代表 在str中搜索keyWords,位置从fromIndex开始搜索
while ((fromIndex = str.indexOf(keyWords, fromIndex)) != -1) {
fromIndex += keyWords.length();//如果查找到了,那么把搜索位置往后挪动
count++;//出现次数+1
}
System.out.println(count);//打印次数
}
}
-----------------分割线---------------------------------
参考代码2:(使用for循环;循环的次数较多)
public class Test2 {
public static void main(String[] args) {
String str = "字符串对象创建后不能对该字符串的字符做修改字符"; //字符串
String keyWords = "字符"; //需要寻找的关键字
int keyLen = keyWords.length();//关键字的长度
int count = 0;//关键字出现的次数
for (int i = 0; i <= str.length() - keyLen; ) {
if (str.substring(i, i + keyLen).indexOf(keyWords) != -1) { //如果查找到了
i = i + keyLen;//因为执行完循环后.下次循环开始的下标=现在下标+长度
count++;
} else {//如果没有查找到
i++;
}
}
System.out.println(count);
}
}