Как заменить N-е вхождение строки? - PullRequest
1 голос
/ 11 апреля 2019

Итак, это мой код:

public class Phrase {
 private String currentPhrase;
 public Phrase (String p) { 
 currentPhrase = p; 
}

public int findNthOccurrence(String str, int n) {
   int c = 0;
   for(int i = 0; i < currentPhrase.length() - str.length(); i++) {
      if(str.equals(currentPhrase.substring(i,i+str.length())))
         c++;
      if(c == n) 
         return i;
   }
   return -1;

}

public void replaceNthOccurence(String str, int n, String rep) {
   int temp = findNthOccurrence(str,n);
   if(temp == -1) {
       currentPhrase = currentPhrase;
   }
   currentPhrase = currentPhrase.substring(0,temp+1) + rep +
   currentPhrase.substring(currentPhrase.length() - rep.length(), currentPhrase.length()-1);

   }
}

Метод findNthOccurrence находит индекс n-го вхождения строки.

Это мой основной код:

    Phrase phrase1 = new Phrase("A cat ate late.");
    phrase1.replaceNthOccurence("at", 1, "rane");
    System.out.println(phrase1);

    Phrase phrase2 = new Phrase("A cat ate late.");
    phrase2.replaceNthOccurence("at", 6, "xx");
    System.out.println(phrase2);

    Phrase phrase3 = new Phrase("A cat ate late.");
    phrase3.replaceNthOccurence("bat", 2, "xx");
    System.out.println(phrase3);

    Phrase phrase4 = new Phrase("aaaa");
    phrase4.replaceNthOccurence("aa", 1, "xx");
    System.out.println(phrase4);

    Phrase phrase5 = new Phrase("aaaa");
    phrase5.replaceNthOccurence("aa", 2, "bbb");
    System.out.println(phrase5);

Когда я их распечатываю, я получаю:

enter image description here

Вот как это должно выглядеть: enter image description here

Как мне перестать получать странные символы, когда я его распечатываю, и правильный ли метод replaceNthOccurence?

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Ваш код работает правильно.Однако проблема заключается в том, что вы выводите сам объект.

Попробуйте реализовать toString внутри вашего класса, например:

@Override
public String toString() {
    return this.currentPhrase;
}

При вызове:

 Phrase phrase1 = new Phrase("A cat ate late.");
    phrase1.replaceNthOccurence("at", 1, "rane");
    System.out.println(phrase1);

Этотеперь должен возвращать

A caraneate

После того, как вы реализовали toString.

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

0 голосов
/ 11 апреля 2019

Ваш код работает нормально. Вы печатаете объект фразы, который вы получаете. Поскольку вы намерены напечатать строку, я предлагаю создать метод getcurrentPhrase (), который возвращает приватную строку currentPhrase. Во время печати просто вызовите этот метод.

Это должно дать вам желаемый результат.

0 голосов
/ 11 апреля 2019

Вот метод, который мне нравится.Мы можем попробовать разбить входную строку на целевое слово.Затем выполните итерацию частей и замените их либо входным словом, либо заменой, в зависимости от позиции.

String input = "a cat ate late";
String word = "at";
String replacement = "rane";
int position = 1;
String[] parts = input.split(word);
StringBuilder output = new StringBuilder(parts[0]);

for (int i=1; i < parts.length; ++i) {
    if (i != position) {
        output.append(word);
    }
    else {
        output.append(replacement);
    }
    output.append(parts[i]);
}

System.out.println(input);
System.out.println(output);

a cat ate late
a crane ate late

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

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