我无法让子串工作

时间:2014-01-31 05:43:45

标签: java pattern-matching substring

此方法应该获取某个模式的出现次数并返回int值。我一直收到这个错误

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

代码

public int getCount(String pattern){
    int occerenceOfPattern = 0;
    for (int i = 0; i <= strand.length(); i++) {
        if (strand.substring(i, i + pattern.length()) == pattern) {
            occerenceOfPattern++;
        }
    }
    return occerenceOfPattern;
}   

7 个答案:

答案 0 :(得分:2)

    i <= strand.length()

.length()返回字符串的总长度,字符串的索引从0开始。因此,如果i等于字符串长度,您将获得越界。要解决此问题:

    i <= strand.length() - 1

    i < strand.length()

答案 1 :(得分:1)

当您指向的索引为StringIndexOutOfBoundsException(不存在)时,会出现

null。我看到的问题出在strand.length()

for (int i = 0; i < strand.length(); i++)

这应该可以正常工作

答案 2 :(得分:1)

你在String上进行了太多的迭代。

对于substringcharAt或任何需要使用精确数值来获取字符或一组字符的方法,String的大小为定义为length()调用减去1的结果。

它就像一个数组(因为它由char[]支持):"cat"长度为3,但它基于零,所以我只能达到2。

将您的情况严格改为小于,不小于或等于。

答案 3 :(得分:1)

public int getCount(String pattern){
    int occerenceOfPattern = 0;
    for (int i = 0; i < strand.length(); i++) {
        if (strand.substring(i, i + pattern.length()) .equals(pattern)) {
            occerenceOfPattern++;
        }
    }
    return occerenceOfPattern;
} 

(已将==更改为.equals。原因请参阅this post)如果不区分大小写,请使用equalIgnoreCase

length()已在其余答案中描述

==测试参考相等。

.equals()测试值的相等性。

How to compare Strings in java

答案 4 :(得分:0)

i <= strand.length() in your for loop is your problem...

length()返回数组中的元素数。永远记住索引从0开始。因此,如果长度为5,则有5个元素0,1,2,3和4.因此,您必须使用i<strand.length();

得到StringIndexOutOfBoundsException因为索引为“length-1”的元素是最后一个元素,并且您尝试访问index =“length”的元素。

答案 5 :(得分:0)

3个问题......

更改&lt; =到&lt;在你的循环中。

您还需要将子字符串的右侧限制为不超过字符串的末尾。

你需要使用.equals()而不是==。

public int getCount(String pattern){
    int occerenceOfPattern = 0;
    for (int i = 0; i < strand.length(); i++) {
        if (strand.substring(i, Math.min(i + pattern.length(), strand.length())).equals(pattern)) {
            occerenceOfPattern++;
        }
    }
    return occerenceOfPattern;
}  

答案 6 :(得分:0)

您需要更正条件检查循环,并在循环块内添加新检查:

public int getCount(String pattern){
    int occerenceOfPattern = 0;
    for (int i = 0; i < strand.length(); i++) { // Updated check
        if((i + pattern.length()) >= strand.length()) // New condition to avoid exception
            break;
        if (strand.substring(i, i + pattern.length()) == pattern) {
            occerenceOfPattern++;
        }
    }
    return occerenceOfPattern;
}

新添加的检查也可以在循环条件下处理。

相关问题