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);
}

就足够了。