从字符串中删除多个子字符串 - Java

5
我需要从给定的字符串中删除多个子字符串。例如 -
String[] exclude = {"one","two","three"};
String input = "if we add one and two we get three"

我希望我的程序能够从输入字符串中删除所有出现的"one"、"two"或"three",并返回结果。
"if we add and we get"

我该如何在Java中实现这个功能?

1
遍历“exclude”并从“input”中删除每个字符串? - chrylis -cautiouslyoptimistic-
是的,我也是这么想的,我正在寻找另一种解决方案。 - Ankit Rustagi
4个回答

5

虽然这个问题已经有了答案,但我对字符串替换的性能很感兴趣,所以进行了一个小测试。因此,我将我的示例代码添加到这里,供所有对结果感兴趣的人使用。我已经以这种方式编写了测试,可以添加其他替换策略来测试自己的。

我有一个测试驱动程序(没有JUnit,这样更容易复制和粘贴)

public class StringReplaceTest {

    public static void main(String[] args) {
        int iterations = 1000000;

        String[] exclude = { "one", "two", "three" };
        String input = "if we add one and two we get three";

        StringRemove replaceAll = new StringReplaceAll();
        StringRemove replace = new StringReplace();
        StringRemove stringUtilsRemove = new StringUtilsRemove();

        // check if the replacement is implemented correctly
        assertStringRemove(replaceAll);
        assertStringRemove(replace);
        assertStringRemove(stringUtilsRemove);

        profileStringRemove(replaceAll, input, exclude, iterations);
        profileStringRemove(replace, input, exclude, iterations);
        profileStringRemove(stringUtilsRemove, input, exclude, iterations);

    }

    private static void assertStringRemove(StringRemove stringRemove) {
        String[] exclude = { "one", "two", "three" };
        String input = "if we add one and two we get three";
        String replaced = stringRemove.remove(input, exclude);

        String expected = "if we add  and  we get ";
        if (!expected.equals(replaced)) {
            throw new IllegalStateException(
                    "String was not replaced correctly. Excpected <" + expected
                            + "> but was <" + replaced + ">");
        }
    }

    private static void profileStringRemove(StringRemove stringRemove,
            String input, String[] subStringsToRemove, int iterations) {
        long start = System.currentTimeMillis();
        int testCount = iterations;
        while (iterations-- > 0) {
            stringRemove.remove(input, subStringsToRemove);
        }
        long end = System.currentTimeMillis();
        printSummery(stringRemove.getClass().getSimpleName(), testCount, start,
                end);
    }

    private static void printSummery(String action, int iterations, long start,
            long end) {
        System.out.println(action + " took: " + (end - start) + " ms for "
                + iterations + " iterations");
    }

还有不同的字符串替换策略:

public interface StringRemove {

    public String remove(String input, String... subStringsToRemove);
}

public class StringReplaceAll implements StringRemove {

    public String remove(String input, String... subStringsToRemove) {
        for (int ix = 0; ix < subStringsToRemove.length; ix++) {
            input = input.replaceAll(subStringsToRemove[ix], "");
        }
        return input;
    }

}

public class StringReplace implements StringRemove {

    public String remove(String input, String... subStringsToRemove) {
        for (int ix = 0; ix < subStringsToRemove.length; ix++) {
            int replaceLength = 0;
            while (replaceLength != input.length()) {
                input = input.replace(subStringsToRemove[ix], "");
                replaceLength = input.length();
            }
        }
        return input;
    }

}

public class StringUtilsRemove implements StringRemove {

    public String remove(String input, String... subStringsToRemove) {
        for (int ix = 0; ix < subStringsToRemove.length; ix++) {
            input = StringUtils.remove(input, subStringsToRemove[ix]);
        }
        return input;
    }

}

我的电脑上的结果是:

StringReplaceAll took: 3456 ms for 1000000 iterations
StringReplace took: 3162 ms for 1000000 iterations
StringUtilsRemove took: 761 ms for 1000000 iterations

感谢@Rene提供的信息。看到这些方法之间的差异真是太神奇了。我也一直在寻找解决这个问题最有效的方法。这个答案提供了我所需要的所有信息。谢谢! - Ankit Rustagi

3
你可以循环遍历这个数组,然后使用replace方法,将输入中出现的每个字符串替换为空字符串:
for(String str : exclude){
    input = input.replace(str, "");
}

3
没有 StringUtils,你可以像这样实现它:
String[] exclude = {"one","two","three"};
String input = "if we add one and two we get three";
for (int ix = 0; ix < exclude.length; ix++) {
    input.replaceAll(exclude[ix], "");
}

2
for(String s:exclude){
    input=input.replace(s,"");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接