Java 递归方法删除第一个字符串中第二个字符串的所有实例和 returns 新的第一个字符串
Java recursive method that removes all instances of a second string in the first string and returns the new first string
我正在尝试在 Java 中编写一个递归方法,该方法接受两个字符串,然后继续从第一个字符串中删除第二个字符串的实例(一次一个)。
例如。字符串 1 == 密西西比州,字符串 2 iss
第一次递归 == Missippi
那么最后的结果应该return米皮
public class RecursionEx {
public static void main(String[] args) {
String str1 = "Mississippi";
String str2 = "iss";
System.out.println(repString(str1, str2));
}
public static String repString(String string1, String string2) {
//base case
if(string1.length()== 0)
return "";
//recursive case
if (string1.substring(0, string2.length()) == string2)
return repString(string1.substring(string2.length()), string2);
else
return repString(string1.substring(1), string2);
}}
正如评论所建议的那样,在 Java 中比较字符串时应该使用 equals(),但您也可以通过使用字符串的 contains 和 removeFirst 方法来处理此递归任务来简化您的生活。
我在递归函数中添加了一个打印行,以表明它一次从 string1 中删除一个 string2 实例。
public class StringRecursion {
public static void main(String[] args) {
String str1 = "Mississippi";
String str2 = "iss";
System.out.println(repString(str1, str2));
}
public static String repString(String string1, String string2) {
if(string1.contains(string2)) {
string1 = string1.replaceFirst(string2, "");
System.out.println("The string is currently: "+ string1);
}
else {
return string1;
}
return repString(string1, string2);
}
}
输出:
The string is currently: Missippi
The string is currently: Mippi
Mippi
重要提示: 使用这种方法要考虑的另一件事是,如果您希望由中间删除形成的模式“iss”也被删除。例如,如果您有单词“iissss”并想删除“iss”,它会在 运行 之后变成“”,即使 iss 最初没有在单词中出现两次。
如果你想要行为模仿 replaceAll 功能,我们希望只摆脱第一个单词中的“iss”模式,而不是中间步骤中出现的模式,我相信该功能:
public static String repString(String string1, String string2) {
if(string1.contains(string2)) {
Pattern pattern = Pattern.compile(string2);
long originalCounts = pattern.matcher(string1).results().count();
string1 = string1.replaceFirst(string2, "");
long newCounts = pattern.matcher(string1).results().count();
if(originalCounts == newCounts) {
Matcher matcher = pattern.matcher(string1);
matcher.find();
int startPosition = matcher.end();
//Skip the generated matching pattern that appears in-between.
return string1.substring(0, startPosition) + repString(string1.substring(startPosition), string2);
}
//System.out.println("The string is currently: "+ string1);
}
else {
return string1;
}
return repString(string1, string2);
}
就足够了。
我正在尝试在 Java 中编写一个递归方法,该方法接受两个字符串,然后继续从第一个字符串中删除第二个字符串的实例(一次一个)。
例如。字符串 1 == 密西西比州,字符串 2 iss 第一次递归 == Missippi 那么最后的结果应该return米皮
public class RecursionEx {
public static void main(String[] args) {
String str1 = "Mississippi";
String str2 = "iss";
System.out.println(repString(str1, str2));
}
public static String repString(String string1, String string2) {
//base case
if(string1.length()== 0)
return "";
//recursive case
if (string1.substring(0, string2.length()) == string2)
return repString(string1.substring(string2.length()), string2);
else
return repString(string1.substring(1), string2);
}}
正如评论所建议的那样,在 Java 中比较字符串时应该使用 equals(),但您也可以通过使用字符串的 contains 和 removeFirst 方法来处理此递归任务来简化您的生活。
我在递归函数中添加了一个打印行,以表明它一次从 string1 中删除一个 string2 实例。
public class StringRecursion {
public static void main(String[] args) {
String str1 = "Mississippi";
String str2 = "iss";
System.out.println(repString(str1, str2));
}
public static String repString(String string1, String string2) {
if(string1.contains(string2)) {
string1 = string1.replaceFirst(string2, "");
System.out.println("The string is currently: "+ string1);
}
else {
return string1;
}
return repString(string1, string2);
}
}
输出:
The string is currently: Missippi
The string is currently: Mippi
Mippi
重要提示: 使用这种方法要考虑的另一件事是,如果您希望由中间删除形成的模式“iss”也被删除。例如,如果您有单词“iissss”并想删除“iss”,它会在 运行 之后变成“”,即使 iss 最初没有在单词中出现两次。
如果你想要行为模仿 replaceAll 功能,我们希望只摆脱第一个单词中的“iss”模式,而不是中间步骤中出现的模式,我相信该功能:
public static String repString(String string1, String string2) {
if(string1.contains(string2)) {
Pattern pattern = Pattern.compile(string2);
long originalCounts = pattern.matcher(string1).results().count();
string1 = string1.replaceFirst(string2, "");
long newCounts = pattern.matcher(string1).results().count();
if(originalCounts == newCounts) {
Matcher matcher = pattern.matcher(string1);
matcher.find();
int startPosition = matcher.end();
//Skip the generated matching pattern that appears in-between.
return string1.substring(0, startPosition) + repString(string1.substring(startPosition), string2);
}
//System.out.println("The string is currently: "+ string1);
}
else {
return string1;
}
return repString(string1, string2);
}
就足够了。