public static int getIndexOf(char ch, String str) {
if (str == null || str.equals("")) {
return 0;
//base case
}else{
char first = str.charAt(0);
if (ch != first) {
return -1;
//returns -1 when the character cannot be found within the string
}else{
int rest = str.length() - 1;
if (str.charAt(rest) == ch) {
return rest;
}
return lastIndexOf(ch, str.substring(0, rest));
//recursive case
}
}
}
这个my方法返回输入字符串的输入字符的索引。但是,当我在交互平面中运行它时,它返回错误的数字。例如,当我输入'a'和“peach”时,它应该返回2,但它返回-1。仅当在字符串中找不到字符时,此方法才应返回-1。谁能告诉我如何处理它? 谢谢!
答案 0 :(得分:1)
那你为什么不介绍逻辑,看看会发生什么。
getIndexOf('a', "peach")
方法进入,字符串不为空或为空,因此它会进入下一行代码。
char first = str.charAt(0); // this is 'p'
if (ch != first) { // is 'p' equal to 'a'? no. so return -1
return -1;
然后你的其余逻辑将永远不会执行。你能看到如何解决这个问题吗?
答案 1 :(得分:0)
您的以下代码部分意味着它将检查字符串的第一个字符是否匹配,否则它将返回-1。
char first = str.charAt(0);
if (ch != first) {
return -1;
这表示如果第0个索引处的字符不匹配则发送-1,因此“peach”中的“p”与“a”不匹配,因此返回-1。
你知道了吗?答案 2 :(得分:0)
输出没有错,执行是!
先用语言思考。如果所需字符是字符串中的第一个字符,则结果为零。否则它是(1 +切断第一个字符后字符串中的索引)。现在编写单词:
return (str.charAt(0) == ch) ? 0 : 1 + getIndexOf(ch, str.substring(1));
这还没有处理字符根本不在字符串中的情况。此处charAt(0)
调用最终会抛出IndexOutOfBoundsException
,因为str
没有!
处理此案例的最简单方法是捕获异常。所以你有两个函数:mustGetIndexOf
,它是上面的递归关系,getIndexOf
,它在try {} catch() {}
内调用上面的函数,在这种情况下返回-1。
当然,如果您不想允许异常,则可以使用if
针对-1
的特殊情况测试递归调用的结果。代码更加丑陋,但它会起作用。每当看到-1
时,再次返回-1
。这会将-1
一直传播回调用者。异常以类似的方式“展开”堆栈上的递归调用,只需使用一个chop而不是逐句逐个调用方式,if
语句将执行此操作。
我不会给你完整的代码,所以你可以继续学习。