在Java中比较一个子字符串和一个字符串

3
基本上,用户输入了两个字符串(CATSATONTHEMAT和AT),我们需要计算第二个字符串在第一个字符串中出现的次数(因此这里的答案是3)。
目前为止这就是我的代码,但它一直显示:
“Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 81223 at java.lang.String.substring(Unknown Source) at practice.main(practice.java:60)"
任何帮助将不胜感激!我只是找不到哪里出错了。
    String s = scan.next(); // CATSATONTHEMAT
    String t = scan.next(); // AT

    int j= 0;

    for ( int i = 0 ; i < s.length(); i++){
        int k = t.length();
        String newstring = s.substring(i,i+k); // I printed this and the substring works so the if statement might not be working..

        if(newstring.equals(t))
            j++;   // if the new substring equal "AT" then add 1
        }

    System.out.printf("%d", j);  // suppose to print just 3

看起来像是一个典型的面试问题!你考虑过使用String.indexOf(String str, int fromIndex)吗?在现实世界中,你只需要使用commons-lang中的StringUtils.countMatches()! - James Bassett
3个回答

3

当i接近s的末尾且k将您带过字符串的末尾时,会发生outOfBounds异常。

您需要将循环更改为仅到达s.length()-t.length()。

for ( int i = 0 ; i < s.length()-t.length(); i++){

我建议将 int k = t.length() 放在 for 循环外部。因为每次迭代都不需要重新赋值,所以可以节省时间。


谢谢!我没有考虑到子字符串会超出循环范围!我更改了边界并添加了一个+1,因为s.length()-t.length()会减去2个空格,而我仍然需要检查这2个空格是否可以是第二个字符串的一部分。我尝试了不同的示例,看起来效果很好。再次感谢! - user1653266

0

0

如果beginIndex为负数,或endIndex大于此String对象的长度,则会发生IndexOutOfBoundsException异常,

或者beginIndex大于endIndex。

在下面的代码行中,由于循环从0到s.length运行,但应该从0到s.length-t.length运行,因此出现了此问题。

String newstring = s.substring(i,i+k);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接