【JAVA小白】看马士兵的教程里面做的一个题目,有错误但是不知道为什么?

题目如下:
JAVA马士兵 常用类 87课 String类
编写一个方法,输出在一个字符串中,制定字符串出现的次数

以下是我自己根据这个作业写的代码:

public class Test {

    public static void main(String[] args) {
        int sum = 0;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入需要被检索的字符串");
        String s = new String(input.next());
        System.out.println(s);
        System.out.println("请输入要放进去检查的小字符串");
        String w = new String(input.next());
        System.out.println(w);
        
        for (int i = 0; i < s.length(); i++) {
            if (s.indexOf(w, i) != -1) {
                sum++;
                s = s.substring(s.indexOf(w,i));
            } else {
                break;
            }
        }
        System.out.println(sum);
        
    }
    
}

这段代码查其他的字符串一般问题不大,但是根据马士兵老师上课的案例,他查的是字符串

sunjavahpjavaokjavajjavahahajavajavagoodjava

马士兵老师上课的源代码是这样的:

clipboard.png

这一段字符串当中有7个java
我查出来是6个
我想问,到底我代码里面哪里不对呢?为什么查出来跟他有差别

阅读 2k
3 个回答

for循环内的正确写法应该时这样

for (int i = 0; i < s.length(); i++) {
   if (s.indexOf(w, 0) != -1) {
       sum++;
       s = s.substring(s.indexOf(w, 0)+w.length());
       System.out.println(s);
   } else {
       break;
   }
}

indexOf 方法:

   public int indexOf(String str, int fromIndex) {
        ...
   }

第二个参数为从字符串哪里开始找。
在你的方法中,每次循环都截取字符串后边为新的字符串,因此应该从index为0的位置找起。
如果用循环次数i为位置进行查找,则会漏掉一些符合条件的字符

s = s.substring(s.indexOf(w,i));每执行一次这行代码,s的内容就会更新一次,而代表s中字符下标的i的值并没有随s更新,不能正确地反映对应字符在新的字符串s中的位置。

我自己发现问题所在了,是循环的时候,每一次的i都加了一次。
随着循环次数不断地加大,这个i的数量越来越大,直到后面超过了java这个字符串数量的长度,那么后面的查询就会自动的一次性跳过4个字符以上 很可能就会直接把其中某一个java跳过 所以最终查出来的数据会少了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题