«Найти подстроку в символе []», получая неожиданные результаты - PullRequest
0 голосов
/ 15 февраля 2019

Отказ от ответственности: Это немного домашний вопрос.Я пытаюсь написать метод contains(java.lang.String subString), который возвращает значение int, представляющее индекс строки сравнения в основной строке, для пользовательского класса String.

Некоторые из правил:

  • Нет классов коллекции
  • Только разрешены charAt () и toCharArray () из класса String java (но разрешены методы из других классов)
  • Предположим length() возвращает длину первичной строки (что именно и делает)

Мой код:

public int contains(java.lang.String subString) {
    this.subString = subString;
    char[] arrSubStr = this.subString.toCharArray();
    //Create initial fail
    int index = -1;
    //Make sure comparison subString is the same length or shorter than the primary string
    if(arrSubStr.length > length()) {
        return index;
    }
    //Steps to perform if initial conditions are met
    else {
        //Compare first character of subString to each character in primary string
        for(int i = 0; i < length(); i++) {
            //When a match is found...
            if(arrSubStr[0] == this.content[i]) {
                //...make sure that the subString is not longer than the remaining length of the primary string
                if(arrSubStr.length > length() - i) {
                    return index;
                }
                //Proceed matching remainder of subString
                else {
                    //Record the index of the beginning of the subString contained in primary string
                    index = i;
                    //Starting with second character of subString...
                    for(int j = 1; j < arrSubStr.length;) {
                        //...compare with subsequent chars of primary string, 
                        //and if a failure of match is found, reset index to failure (-1)
                        if(arrSubStr[j] != this.content[j+i]) {
                            index = -1;
                            return index;
                        }
                        //If we get here, it means whole subString match found
                        //Return the index (=i) we set earlier
                        else {
                            return index;
                        }
                    }
                }
            }
        }
    }
return index;
}

Результаты тестирования:

Первичная строка: asdfg
Строка сравнения: donkey
Результат: -1 [PASS]

Первичная строка: asdfg
Строка сравнения: asdfg
Результат:0 [PASS]

Основная строка: asdfg
Строка сравнения: g
Результат: 4 [PASS]

Основная строка: asasasf
Строка сравнения: asd
Результат: 0 [ FAIL ] (должно быть -1)

Основная строка: asasasf
Coстрока mparison: asf
Результат: 0 [ FAIL ] (должно быть 4)

Комментарии отражают работу кода.Однако ясно, что когда он достигает второго цикла for, логика как-то ломается, чтобы дать результаты выше.Но я не вижу проблемы.Могу ли я получить второй взгляд на это?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

С предложениями от Jai и azurefrog в комментариях я смог решить проблемы, переписав логику следующего (несколько сокращенного):

    if(arrSubStr.length > length()) {
        return index;
    }
    //Steps to perform if initial conditions are met
    else {
        //Compare first character of subString to each character in primary string
        for(int i = 0; i < length(); i++) {
            //When a match is found...
            if(arrSubStr[0] == this.content[i]) {
                //...make sure that the subString is not longer than the remaining length of the primary string
                if(arrSubStr.length <= length() - i) {
                    //Record the index of the beginning of the subString contained in primary string
                    index = i;
                    //Starting with second character of subString...
                    for(int j = 1; j < arrSubStr.length; j++) {
                        //...compare with subsequent chars of primary string, 
                        //and if a failure of match is found, reset index to failure (-1)
                        if(arrSubStr[j] != this.content[j+i]) {
                            index = -1;
                            break;
                        }
                    }
                }
            }
        }
    }
return index;

По сути, я удалил всеreturn операторы внутри циклов.Простая установка значения index надлежащим образом и использование последнего (внешнего) оператора return, задним числом, было правильным способом решения проблемы.Затем я также добавил break; к внутреннему циклу for, чтобы убедиться, что неудачное совпадение продолжит тиковый цикл.Я уверен, что там все еще есть ненужный код, но, хотя он все еще проходит необходимые тесты, я рекомендую оставить его в покое.:)
Я все еще новичок в Java, поэтому надеюсь, что это объяснение имело смысл.

0 голосов
/ 15 февраля 2019
//If we get here, it means whole subString match found
//Return the index (=i) we set earlier
else {
    return index;
}

Это предположение, к сожалению, неверно.Если вы попадаете туда, это означает, что второй символ обеих подстрок идентичен, поскольку оператор if-else будет выполнен только один раз, и оба конца содержат return.

. Способ решить эту проблему, вероятно, просттеперь, когда я диагностировал проблему, но я хочу пойти немного дальше с этим.То, как мы пытаемся писать код ежедневно, - это способ, которым код, который мы используем, может быть обслуживаемым, многократно используемым и тестируемым .

Это означает, что, в основном, наша функция можетбыть легко разбитым на разные маленькие функции, вызываемые одна за другой, для которых мы могли бы написать модульные тесты и быстро получить ответ о том, подходит ли набор логических операторов или нет.

...