这是我的代码:
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);
当我将它们打印出来时,我会得到:
打印出来后如何停止获取奇怪的字符,并且replaceNthOccurence方法正确吗?
答案 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字符串。在打印时只需调用此方法即可。
这应该为您带来所需的结果。