【问题标题】:Java Recursively delete the content in the formatJava递归删除格式中的内容
【发布时间】:2016-02-02 20:05:54
【问题描述】:

我使用递归来删除文本中不必要的字符。

前: source ="这是演示 java 删除字符串"

regex ="这,是,java"

result ="demo 删除字符串"

当程序停止递归函数时,我很难不提供条件。如果有任何方法可以更有效地使用递归,请告诉我

public class NewClass2 {

    static String regexs[] = {"This","is", "java"};

    private static String getRecursive(String source, int level) {

        String content = "";

        if (level > regexs.length - 1) {
            return "";
        }

        level++;

        for (String regex : regexs) {
            content = source.replaceAll(regex, "");

            if (!content.equals("")) {
                content = getRecursive(content, level);
            }
        }
        return content;
    }

    public static void main(String[] args) {
        String result = getRecursive("This is demo java remove string", 0);
        System.out.println(result);
    }
}

【问题讨论】:

  • 一定要用递归吗?
  • 在这个设置中,你真的不需要递归。您可以在 for 循环中轻松完成
  • 你要么使用for循环,要么使用递归函数,你不需要booth,不需要第二个IF语句,你在函数的开头有一个(janos回答)
  • 非常感谢大家的建议和声明,他们工作得很好,我学到了很多
  • @janos 我认为想要执行可以只使用递归,我不知道还有其他可能的实现方法。所以很高兴我能看到你的方法

标签: java arrays string recursion


【解决方案1】:

你的递归方法……全错了。

  • 你不应该在那里使用循环。
  • level > regexs.length - 1时,你应该返回source,而不是""

清理的方法变得简单了很多:

private static String getRecursive(String source, int level) {
    if (level >= regexs.length) {
        return source;
    }
    return getRecursive(source.replaceAll(regexs[level], ""), level + 1);
}

但是,这仍然不能完全满足您的要求。 它给出了“demo remove string”而不是“demo remove string”, 因为regexs 中的值不包含空格,所以单词之间的空格不会被删除。要解决此问题,您可以将 "\\s*" 附加到模式中,例如:

    return getRecursive(source.replaceAll(regexs[level] + "\\s*", ""), level + 1);

【讨论】:

  • 非常完整的声明,它帮助我不用担心包含空格
  • 当使用递归处理更多数据时,如果应用执行器会非常好。工作完成后检查有困难,期待您的帮助stackoverflow.com/questions/33512762/…
【解决方案2】:

假设您必须使用递归。假设您必须使用递归。假设您必须使用递归... ;)

我讨厌 java 中的数组。它们不是必需的:

Queue regexs = new LinkedList<String>();
regexs.add("This");
regexs.add("is");
regexs.add("Java");

private static String getRecursive(String someSource, Queue regs) {
    if (regs.size() != 0) return getRecursive(someSource.replaceAll(regs.poll(), ""), regs);
    else return someSource;
}

public static void main(String[] args) {
    Queue regsCopy = new LinkedList(regexs); // we make a copy of the original queue list so that we can use it again in the future. Otherwise the list will be empty after just one use of the getRecursive method.
    System.out.println(getRecusive("This is demo java removing string", regsCopy));
}

【讨论】:

  • 假设您必须使用递归。假设您必须使用递归... -> 这是迭代,而不是递归。 :P
  • 迭代遍历一个可能或不可能重复的列表。递归就是重复。程序员希望做的递归是退化递归,以便它自然结束。 :P
  • 迭代开始一个步骤,然后完成该步骤,然后开始下一步。递归开始一个步骤,然后向自己询问一个子步骤的结果,它向自己询问一个子步骤的结果,它向自己询问一个子步骤的结果,它...... 3! -> 2! -> 1! -> 0!
  • 同意不同意。现在我们要吃蛋糕了(尽管我们必须争论蛋糕是否是谎言)。
  • 只要我能握住枪,不管是真蛋糕还是假蛋糕,我都很高兴。
【解决方案3】:

你必须使用递归吗?一个更简单的方法是

Pattern p = Pattern.compile("This|is|java");
Matcher m = p.matcher("This is demo java remove string");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "");
}
m.appendTail(sb);
System.out.println(sb.toString());

另外,如果你的 for 循环如下所示

for (String regex : regexs) {
            source= source.replaceAll(regex, "");
            }

System.out.println(source);

return source;

你不需要递归。

【讨论】:

  • 谢谢 AbtPst。代码 1 完美但代码 2 : 不正确。它只会替换最后一个字符。
  • 我现在不明白 2 的工作原理。但是使用递归时您的代码 2 是正确的(janos 已回答)。如果没有找到替代递归使用的方法,我的数学是一个很好的方法.我想是的
猜你喜欢
  • 2012-02-27
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
相关资源
最近更新 更多