indexOf (String str) - приравнивает строку к другой строке - PullRequest
0 голосов
/ 14 июня 2011

Мне нужно написать метод, который проверяет «String str» на другой строке и возвращает индекс, с которого начинается str.

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

я пробовал:

public int IndexOf (String str) {

   for (i= 0;i<_st.length();i++)
   {
        if (_st.charAt(i) == str.charAt(i)) {
            i++;
            if (_st.charAt(i) == str.charAt(i)) {
                return i;
            }
        }
   }
   return -1;
 }

но я не получаю правильное возвращение. Зачем? я на правильном пути или даже не близко?

Ответы [ 5 ]

3 голосов
/ 14 июня 2011

Боюсь, вы не близко.

Вот что вам нужно сделать:

  • Цикл символов строки (тот, который на , который вы должны сделать indexOf, я назову это master ) (вы делаете это правильно )
  • Для каждого символа проверьте, совпадают ли символы вашей другой строки и этот символ.
  • Если это (потенциальное начало одной и той же последовательности), проверьте, совпадают ли следующие символы в мастере с вашей строкой (возможно, вы захотите пройтись по элементам строки и проверить один за другим).
  • Если они не совпадают, продолжайте с символами в основной строке

Что-то вроде:

Loop master string
for every character (using index i, lets say)
   check whether this is same as first character of the other string
   if it is
      //potential match
      loop through the characters in the child string (lets say using index j)

      match them with the consecutive characters in the master string 
      (something like master[j+i] == sub[j])

       If everything match, 'i' is what you want
       otherwise, continue with the master, hoping you find a match

Некоторые другие пункты:

  • В Java имена методов начинаются с строчная буква конвенция (имеется ввиду, компилятор не жалуются, но ваши коллеги-программисты может). Так что IndexOf на самом деле должно быть indexOf
  • Наличие переменных экземпляра (переменные уровня класса) начинаются с _ (как в _st) не очень хорошо практика. Если твой профессор настаивает, у вас не может быть много вариантов, но имейте это в виду)
2 голосов
/ 14 июня 2011

Боюсь, не совсем близко. В основном этот код проверяет, есть ли в двух строках два символа в одинаковых позициях в любой точке, и, если это так, возвращает индекс второго из этих символов. Например, если _str это "abcdefg", а str это "12cd45", вы вернете 3, потому что у них есть "cd" в том же месте, и это индекс "d". По крайней мере, это настолько близко, насколько я могу судить, что он на самом деле делает. Это потому, что вы индексируете в обе строки одну и ту же индексную переменную.

Чтобы переписать indexOf, ища str в _st, вам нужно отсканировать _st для поиска первого символа в str, а затем проверить, совпадают ли остальные символы; если нет, поднимитесь вперед на одно место, откуда вы начали проверку, и продолжите сканирование. (Есть оптимизация, которую вы можете выполнить, но в этом суть.) Так, например, если вы найдете первый символ str в индексе 4 в _st и str длиной шесть символов, найдя первый символ, который нужно увидеть, если остальные пять (str индексы 1-5 включительно) соответствуют _st индексам 5-10 включительно (проще всего проверить все шесть символов str на подстроке _st начиная с 4 и заканчивая шестью символами). Если все совпадает, верните индекс, по которому вы нашли первый символ (так, 4 в этом примере). Вы можете остановить сканирование на _st.length() - str.length(), поскольку, если вы не обнаружили, что оно запускается до этого момента, вы вообще его не найдете.

Боковая точка: не вызывайте функцию length в каждом цикле. JIT может быть в состоянии оптимизировать вызов, но если вы знаете, что _st не изменится в ходе выполнения этой функции (и если вы этого не знаете, вам это потребуется) , возьмите length() в местном и затем обратитесь к этому. И, конечно же, поскольку вы знаете, что можете остановиться раньше, чем length(), вы будете использовать локальную систему, чтобы запомнить, где можно остановиться.

0 голосов
/ 14 июня 2011

Может быть, исходный код Oracle Java API действительно поможет:

<code>   /**
     * Returns the index within this string of the first occurrence of the
     * specified substring. The integer returned is the smallest value
     * <i>k</i> such that:
     * <blockquote><pre>
     * this.startsWith(str, <i>k</i>)
     * 
* это true. * * @param str любая строка. * @return, если строковый аргумент встречается как подстрока в этом * объект, то индекс первого символа первого * такая подстрока возвращается; если это не происходит как * подстрока, -1 возвращается. * / public int indexOf (String str) { return indexOf (str, 0); } / ** * Возвращает индекс в этой строке первого вхождения * указанная подстрока, начиная с указанного индекса. Целое число * возвращается наименьшее значение k , для которого: *
     *     k &gt;= Math.min(fromIndex, this.length()) && this.startsWith(str, k)
     * 
* Если такого значения k не существует, то возвращается -1. * * @param str подстрока для поиска. * @param fromIndex индекс, с которого начинается поиск. * @ вернуть индекс в этой строке первого вхождения * указанная подстрока, начиная с указанного индекса. * / public int indexOf (String str, int fromIndex) { вернуть indexOf (значение, смещение, количество, str.value, str.offset, str.count, fromIndex); } / ** * Код, совместно используемый String и StringBuffer для поиска. * source - массив символов, который ищется, и цель * это искомая строка. * * @param источник символов для поиска. * @param sourceOffset смещение исходной строки. * @param sourceCount количество исходной строки. * @param предназначается для искомых символов. * @param targetOffset смещение целевой строки. * @param targetCount количество целевой строки. * @param fromIndex индекс, с которого начинается поиск. * / статический int indexOf (char [] source, int sourceOffset, int sourceCount, char [] target, int targetOffset, int targetCount, int fromIndex) { if (fromIndex> = sourceCount) { return (targetCount == 0? sourceCount: -1); } if (fromIndex
0 голосов
/ 14 июня 2011

Ваш код просматривает искомую строку, и если символы в позиции i совпадают, он проверяет следующую позицию.Если строки совпадают в следующей позиции, вы предполагаете, что строка str содержится в _st.

Что вы, вероятно, хотите сделать, это:

  • отслеживать, содержится ли вся строка в _st.Вы могли бы, вероятно, проверить, имеет ли искомая строка длину, равную количеству совпадающих символов.
  • если вы выполните вышеизложенное, то вы можете получить начальный индекс, вычтя количество совпадений до сих порот текущего значения i.

Один вопрос:

Почему вы не используете встроенную функцию String.IndexOf ()?Это задание предназначено для вас, чтобы реализовать эту функцию самостоятельно?

0 голосов
/ 14 июня 2011

Вы используете i для обеих одинаковых строк, но вы не хотите, чтобы первая строка всегда начиналась с 0, если символ не найден, является другой строкой.Затем проверьте, равны ли следующие символы и т. Д.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...