Java replaceSubstring () метод, который включает StringBuilder? - PullRequest
0 голосов
/ 31 октября 2018

Часть моего задания - создать метод, который заменяет все вхождения строки 2, которые встречаются в строке 1, строкой 3. Поэтому, если бы предложение было: «собака перепрыгнула через забор», я бы хотел метод для замены всех вхождений любой строки 2, которая, скажем, «the», с содержанием строки 3, которая, скажем, «this».

Так что я бы хотел сказать, что «эта собака перепрыгнула через забор».

Это действительно легко, если мой учитель-профессор допустил более удобный способ, но весь этот курс просто неудобен, когда речь идет об обучении, поэтому я ДОЛЖЕН использовать объект StringBuilder.

Пока мой код для replaceSubstring () равен

   public static String replaceSubstring(String str1, String str2, String str3)
   {
      String str1Copy = str1, str2Copy = str2, str3Copy = str3;

      if (str2Copy.equals(str3Copy))
      {
         return str1Copy;
      }

      StringBuilder b = new StringBuilder(str1Copy);

      int index = b.indexOf(str2Copy);

      b.replace(index, (index + str2Copy.length()), str3Copy);

      index = b.indexOf(str3Copy);


      return b.toString();
   }

Однако я столкнулся с проблемой, потому что, когда я запускаю этот код в классе приложения, который печатает инструкцию возврата этого метода, я получаю

After replacing "the" with "that", the string: that dog jumped over the fence

В моей консоли. Исходная строка - «собака прыгнула через забор», и мой код должен изменить ее на «эта собака прыгнула через забор», однако она просто меняет первое вхождение «», а не второе. Я действительно ломаю голову над этим, потому что я понимаю, как я мог просто сделать что-то вроде

return string1.replaceAll(string2, string3);

И назовите это днем, но я бы потерял очки за то, что не сделал этого так, как этого хочет мой профессор, то есть с помощью объекта StringBuilder. Что мне здесь не хватает? Также я не могу импортировать пакеты, созданные кем-то другим. Я должен использовать общий и базовый комплект Java.

РЕДАКТИРОВАТЬ: новый код, кажется, работает

   public static String replaceSubstring(String str1, String str2, String str3)
   {
      String str1Copy = new String (str1), str2Copy = new String (str2), str3Copy = new String (str3);

      if (str2Copy.equals(str3Copy))
      {
         return str1Copy;
      }

      StringBuilder b = new StringBuilder(str1Copy);

      int index = b.indexOf(str2Copy);
      while (index != -1)
      {
         b.replace(index, (index + str2Copy.length()), str3Copy);
         index = b.indexOf(str2Copy, index + 1);
      }

      return b.toString();
   }

1 Ответ

0 голосов
/ 31 октября 2018

Вы должны выполнить цикл, пока больше нет вхождений str2 в str1. indexOf() возвращает -1, если больше нет вхождений, поэтому вы можете использовать это для решения этой проблемы. Внутри петли вы используете перегрузку indexOf(String str, int fromIndex). Также вам не нужны копии String:

public static String replaceSubstring(String str1, String str2, String str3)
{ 
    if (str2.equals(str3))
    {
        return str1;
    }

    StringBuilder b = new StringBuilder(str1);
    int index = b.indexOf(str2); 
    //Loop while there is still an occurrence of str2       
    while(index != -1) {
        b.replace(index, (index + str2.length()), str3);
        index = b.indexOf(str2, index+str3.length());
    }

    return b.toString();
}

Строка:

index = b.indexOf(str2, index+str3.length());

Перемещает поиск в прошлое, где мы уже нашли событие. На первой итерации мы просто вызываем indexOf() без указания начального индекса, поэтому он начнется в начале String:

the dog jumped over the fence
^index points to the first occurrence of the (0)

Как только мы вызовем indexOf(), указав начальный индекс как index + str3.length(), начальный индекс будет 0 + 4, поэтому поиск будет перемещен на:

that dog jumped over the fence
    ^Start the search here.

Чтобы понять, почему это важно, если мы заменим the на tthe, без указания начального индекса, это будет выглядеть так:

the dog jumped over the fence
^found first occurrence. Replace with tthe

Вторая итерация цикла:

tthe dog jumped over the fence
 ^Found another one! replace again.

Третья итерация цикла:

ttthe dog jumped over the fence
  ^Another occurrence of the. 

и т. Д. И т. Д.

...