【问题标题】:Writing custom indexOf() method in java在 java 中编写自定义 indexOf() 方法
【发布时间】:2019-10-31 19:48:25
【问题描述】:

我目前正在尝试调试我正在为一个名为 MyString 的类编写的 indexOf() 方法。以下是相关方法:

public int indexOf(int startIndex, char ch) 
{
    if(startIndex < 0 || startIndex >= length())
    {
        System.out.println("\nFATAL ERROR: indexOf() given invalid startIndex\n");
        System.exit(0);
    }
    for(int i = startIndex; i < this.length(); i++)
    {
        if(this.charAt(i) == ch)
        {
            return i;
        }
    }
    return NOT_FOUND;
}


public int indexOf(MyString key)
{   
    if(key.length() > this.length())
    {
        return NOT_FOUND;
    }
    int indexOfFirstKeyLetter = indexOf(0, key.letters[0]);
    while(indexOfFirstKeyLetter != NOT_FOUND)
    {
        if(keyFound(indexOfFirstKeyLetter, key))
        {
            return indexOfFirstKeyLetter;
        }
        else
        {
            indexOfFirstKeyLetter = indexOf(indexOfFirstKeyLetter + 1, key.letters[0]);
        }
    }
    return NOT_FOUND;
}


private boolean keyFound(int indexOfFirstKeyLetter, MyString key) //Note: this method works for most strings, but doesn't work if the end of MyString is identical to the first few letters of key (ex: ado and dog falsely returns as true)
{
    for(int i = indexOfFirstKeyLetter; i < key.length() + indexOfFirstKeyLetter && i < this.length(); i++)
    {
        if(this.letters[i] != key.letters[i - indexOfFirstKeyLetter])
        {
            return false;
        }
    }
    return true;
}

我相信问题出在我的 keyFound 方法上,虽然它适用于大多数字符串,但当正在测试的 MyString 对象的结尾与它所比较的​​键的前几个字母相同时,它将返回 true。例如,在indexOf(MyString other)方法中测试“ado”和“dog”时,返回值1,表示在this.letters[1]位置找到匹配开始的索引,当它应该返回 NOT_FOUND 或 -1,因为完整的键字符串“dog”不在“ado”中。有什么方法可以改变我的 keyFound 方法来解决这个问题?

【问题讨论】:

  • 爱它 - 我用无效索引调用你的方法,整个 JVM 退出
  • 很少有使用System.exit的正当理由。考虑抛出异常。然后调用者可以弄清楚如何处理它,并可以决定他是要恢复还是崩溃。使用System.exit,您将杀死一切,没有人有机会做出反应甚至执行正确的关闭逻辑。
  • 我知道我可以很容易地抛出一个异常来阻止代码简单地退出,但这就是我的教授希望它用于作业的方式,因为我们还没有~正式~学习异常。
  • 欢迎来到 Stack Overflow!请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。不要冗长地描述您的代码何时失败。给我们一段完整的代码,其中已经包含您的示例代码。是的:忘记 system.exit,研究异常
  • 告诉你的教授,教人们以后必须忘记的东西是个坏主意;-)

标签: java indexof


【解决方案1】:

发生的情况是您到达字符串的末尾并在它检查整个比较字符串之前退出:

你的逻辑是:“ado”是“dog”吗?在 'ado' 中找到与 'd' 匹配的第一个索引,它是 1. "d" == "d"。很好,下一个字母,“o”==“o”。下一封信不错。等待。 'ado' 字符串已完成。一定是找到了。返回真。

您的 keyFound 函数需要一个提前退出条件,如果它在搜索整个“key”的长度之前是字符串的结尾,则返回 false。

请注意,这比它必须的要复杂得多。您可以通过一个循环轻松完成此操作。你现在的所有循环都在 O(n^3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多