【问题标题】:Java recursive method that removes all instances of a second string in the first string and returns the new first stringJava递归方法,删除第一个字符串中第二个字符串的所有实例并返回新的第一个字符串
【发布时间】:2022-01-30 02:42:45
【问题描述】:

我正在尝试在 Java 中编写一个递归方法,它接受两个字符串,然后继续从第一个字符串中删除第二个字符串的实例(一次一个)。

例如。字符串 1 == 密西西比州,字符串 2 iss 第一次递归 == 密西比 那么最终结果应该返回 Mippi

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 string recursion replace


【解决方案1】:

就像评论建议的那样,在 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”也被移除。例如,如果您有单词“iisss”并且想要删除“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);
}

就足够了。

【讨论】:

  • 我没记下来,但是string1.contains(string2) 是必需的吗?
  • 这个结果和replaceAll一样吗?
  • @AdityaArora 它没有,区别在于 replaceAll 从原始单词中删除所有匹配实例,而这将删除不是来自原始单词但也由中间步骤形成的匹配项(把在最后一段中澄清)。当他说“一次一个”时,不确定 OP 想要什么行为。
  • @RichardKYu 我的意思正是你如何回答它。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-06-24
  • 2012-11-27
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多