如何替换第N个出现的字符串?

时间:2019-04-11 04:21:10

标签: java debugging

这是我的代码:

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个出现的str的索引。

这是我的主要爱好:

    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 个答案:

答案 0 :(得分:1)

您的代码似乎正常工作。但是,问题在于您要使用对象本身。

尝试在类中实现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方法,则在打印对象时,它将打印类的名称,后跟@符号和对象的哈希码(十六进制)。

答案 1 :(得分:0)

这是我喜欢的方法。我们可以尝试在目标单词上分割输入字符串。然后,对零件进行迭代,并根据位置用输入字或替换字替换。

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

请注意,这种方法为更复杂的替换逻辑留下了可能性。例如,可以轻松修改以上代码,以处理要替换匹配词的所有其他出现的用例。

答案 2 :(得分:0)

您的代码运行正常。您正在打印所得到的短语对象。由于您打算打印该字符串,因此建议创建一个getcurrentPhrase()方法,该方法返回私有的currentPhrase字符串。在打印时只需调用此方法即可。

这应该为您带来所需的结果。