2

下面的代码试图给定一个字符串,递归计算(无循环)字符串中小写“x”字符的数量。

代码出现此错误:线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0

这段代码的主要方法是:

public static void main(String [] args)
{
  System.out.println(countX("hx1x"));
}

实际代码是:

public static int countX(String str)
{ 
    if(str.charAt(0) != 'x')
    {
        if(str.indexOf('x') >= 1)
        {
            return countX(str.substring(1, str.length()));
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 1 + countX(str.substring(1, str.length()));
    }
}
4

4 回答 4

1

只需添加

    if (str.length() <= 0) return 0;

在 countX(...) 开始时

异常被抛出

    if(str.charAt(0) != 'x')

当 str 为 ""

顺便提一句。在为每个字符检查创建新字符串时,该代码并不完全有效。像这样的递归函数也会抛出具有足够长输入的 StackOverflowError。

看看这个: Java:如何计算字符串中字符的出现次数?

于 2011-10-22T18:08:36.390 回答
0

为您的函数编写一组单元测试。现在,这可能像一些行一样简单

assertEquals(2, countX("hx1x", 0));

到你的主要()。从非常简单的案例开始,例如:

assertEquals(0, countX("", 0));
assertEquals(0, countX("a", 0));
assertEquals(1, countX("x", 0));

这些将更容易调试 - 如果必须使用调试器,但如果您的示例很简单,则可能甚至没有必要。

于 2011-10-22T22:03:17.923 回答
0

你错过了递归的基本情况——如果字符串的长度为零会发生什么?尝试这个:

public static int countX(String str) {
    if (str.length() == 0)
        return 0;
    else if (str.charAt(0) == 'x')
        return 1 + countX(str.substring(1));
    else
        return countX(str.substring(1));
}

或者,您可以省略子字符串操作并传递您当前所在的索引 - 这种方式更有效,因为它避免了创建不必要的字符串对象

public static int countX(String str, int idx) {
    if (idx == str.length())
        return 0;
    else if (str.charAt(idx) == 'x')
        return 1 + countX(str, idx+1);
    else
        return countX(str, idx+1);
}

然后,您将像这样调用该方法:

countX("hx1x", 0)
于 2011-10-22T18:10:16.563 回答
0

当您可以做一些简单的事情时,为什么要让它变得如此复杂?这是一个更简单的解决您的问题的方法:

    int count=0;
    for(int i = 0; i< str.length(); i++){
        if(str.charAt(i) == 'x') count++;
    }
于 2011-10-22T22:31:33.247 回答