我的工作的一部分是创建一个方法,用字符串3替换字符串1中出现的所有字符串2。因此,如果句子是:“那只狗跳过了篱笆”,我想用字符串3的内容(例如,“ that”)替换所有出现的字符串2(假设是“ the”)的方法。
所以我要说“那只狗跳过了篱笆”。
如果我的老师教授允许使用更方便的方法,这真的很容易,但是整个学习过程都不方便,因此我必须使用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();
}
但是我遇到了一个问题,因为当我在打印该方法的return语句的应用程序类中运行此代码时,我会得到
After replacing "the" with "that", the string: that dog jumped over the fence
在我的控制台中。原始字符串是“狗跳过篱笆”,我的代码应将其更改为“狗跳过篱笆”,但是它只是更改了第一次出现的“ the”,而不是第二次出现。我真的为此head之以鼻,因为我知道我该怎么做
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();
}
答案 0 :(得分:1)
在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.
等等,