0
    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
        }
    }
}

这是我的方法,它返回输入字符串的输入字符的索引。但是,当我在交互平面中运行它时,它返回错误的数字。例如,当我输入“a”和“peach”时,它应该返回 2,但它返回 -1。仅当在字符串中找不到字符时,此方法才应返回 -1。谁能告诉我如何处理它?谢谢!

4

3 回答 3

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;

然后你的其余逻辑将永远不会执行。你能看到如何解决这个问题吗?

于 2013-04-05T00:40:03.230 回答
0

输出没有错,执行是!

先用文字思考。如果所需字符是字符串中的第一个字符,则结果为零。否则它是(1 + 切断第一个字符后保留的字符串中的索引)。现在对单词进行编码:

return (str.charAt(0) == ch) ? 0 : 1 + getIndexOf(ch, str.substring(1));

这还不能处理字符根本不在字符串中的情况。在这里charAt(0)调用最终会抛出IndexOutOfBoundsException,因为str没有一个!

处理这种情况的最简洁的方法是捕获异常。所以你有两个函数:mustGetIndexOf,它是上面的递归关系,和getIndexOf,它在 a 中调用上面的一个try {} catch() {},在这种情况下返回 -1。

当然,如果您不想允许异常,您可以使用if特殊情况测试递归调用的结果-1。代码更丑陋,但它会工作。每当-1看到 a 时,-1再次返回。这会-1一直传播回调用者。异常以类似的方式“展开”堆栈上的递归调用,只需一次斩波,而不是您的if语句将执行的逐步调用方式。

我不会给你完整的代码,所以你可以继续学习。

于 2013-04-05T00:59:43.070 回答
0

您的以下代码部分意味着它将检查字符串的第一个字符是否匹配,否则将返回-1。

char first = str.charAt(0);
        if (ch != first) {
            return -1;

这表示如果第 0 个索引处的字符不匹配,则发送 -1,因此“peach”中的“p”与“a”不匹配,因此返回 -1。

你明白了吗?

于 2013-04-05T00:42:19.777 回答