簡體   English   中英

在 java 中編寫自定義 indexOf() 方法

[英]Writing custom indexOf() method in java

我目前正在嘗試調試我正在為名為 MyString 的 class 編寫的 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 Object 的結尾與它所比較的鍵的前幾個字母相同時,它將返回 true。 例如,在indexOf(MyString other)方法中測試“ado”和“dog”時,返回值1,表示在this.letters[1]位置找到匹配開始的索引,當它應該返回 NOT_FOUND 或 -1,因為完整的鍵字符串“dog”不在“ado”中。 有什么方法可以改變我的 keyFound 方法來解決這個問題嗎?

發生的事情是您到達字符串的末尾並在它檢查整個比較字符串之前退出:

你的邏輯是:“狗”在“ado”中嗎? 在 'ado' 中找到與 'd' 匹配的第一個索引,它是 1. "d" == "d"。 很好,下一個字母,“o”==“o”。 下一封信不錯。 等待。 'ado' 字符串已完成。 一定是找到了。 返回真。

您需要在 keyFound function 中有一個提前退出條件,如果它在搜索整個“密鑰”長度之前是字符串的結尾,則返回 false。

正如一個注釋,這比它必須的要復雜得多。 您可以通過一個循環輕松完成此操作。 你現在處於 O(n^3) 的所有循環中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM