以下代码尝试给定一个字符串,递归计算(无循环)字符串中小写“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()));
}
}
答案 0 :(得分:1)
添加
if (str.length() <= 0) return 0;
在countX开始(...)
抛出异常
if(str.charAt(0) != 'x')
当str是“”
时顺便说一下。在为每个char检查创建新字符串时,代码并不完全有效。像这样的递归函数抛出StackOverflowError并输入足够长的时间。
看看这个: Java: How do I count the number of occurrences of a char in a String?
答案 1 :(得分: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)
答案 2 :(得分:0)
为您的功能编写一组单元测试。现在,这可能像一些像
这样的行一样简单assertEquals(2, countX("hx1x", 0));
到你的主()。从非常简单的案例开始,例如:
assertEquals(0, countX("", 0));
assertEquals(0, countX("a", 0));
assertEquals(1, countX("x", 0));
这些将更容易调试 - 如果必须,请使用调试器,但如果您的示例很简单,则可能甚至不需要。
答案 3 :(得分:0)
为什么要做一些简单的事情会让它变得如此复杂?这是一个更简单的问题解决方案:
int count=0;
for(int i = 0; i< str.length(); i++){
if(str.charAt(i) == 'x') count++;
}