java - 如何有效地从另一个字符串中删除一个字符串的所有实例?

标签 java string performance replaceall string-utils

我正在解决的问题是替换另一个字符串中的所有字符串。

我在codingbat.com上通过使用String.replaceAll相当轻松地解决了这个问题,直到第一个字符串不再包含另一个字符串。

但是,我不喜欢这种方法,因为它非常慢。我尝试在该网站上搜索更有效的方法,并遇到了以下问题:

Fastest way to perform a lot of strings replace in Java

String.replaceAll is considerably slower than doing the job yourself

他们通过使用 StringUtils 和 Patterns 解决了这个问题。我仍然认为这些方法太慢了!

当我编写此类问题时,我希望使用 Java 将运行时间控制在两秒以内。我正在使用 1,000,000 个字符的字符串对此进行测试。 String.replaceAll 运行顺利超过两秒,其他两个方法也是如此。

有人能快速解决这个问题吗?谢谢!

编辑:不幸的是,我收到的答案仍然运行得太慢。是的,我的意思是创建一个新的字符串,而不是更改旧的字符串,对这个错误感到抱歉。

我不确定它是如何工作的,但我认为循环每个字符并检查可能会起作用。有算法的东西。

最佳答案

字符串是不可变的,因此您无法从中删除内容。这意味着您需要创建一个新的字符串,而不包含要删除的内容。当您使用 String.replace 时,它​​的作用几乎就是这样:它创建一个新的字符串。

请注意 String.replaceAll,因为它使用每次调用时都会编译的正则表达式(因此切勿在长循环中使用它)。这可能是您的问题。

如果您需要使用正则表达式,请使用 Pattern 类来编译您的正则表达式并重用该实例来为您处理的每个字符串创建一个新的 Matcher。如果您不重用您的 Pattern 实例,速度将会很慢。

如果你不需要正则表达式,StringUtils有一个不依赖正则表达式的replaceEach()。

如果您正在处理一个大字符串。您可能希望以流式处理方式执行操作并循环字符并将字符复制到 StringBuilder。

或者,您可以使用正则表达式在字符串中搜索特定模式,然后循环查找找到的匹配项,并为每个匹配项将上一个匹配项到当前匹配项的所有内容附加到 StringBuilder。

关于java - 如何有效地从另一个字符串中删除一个字符串的所有实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28632957/

相关文章:

java - 在 jar 中提供 xsd 架构

java - 关闭 javac 警告

java - Spring Data JPA xml 配置 : "Table not found" with create-drop

java - 在 switch 语句内循环或在循环内使用 switch 语句更有效?

javascript - Telerik - 将 JavaScript 文件包含在页面底部

Java + Docker : Different datasource url

r - 如何提取R中的第一个字符串

c# - 如何在 C# 中将某个 string[index] 转换为 int?

c++ - 为什么这两种输入字符串的方法都有效?

javascript - 尝试理解 Javascript 中的 DRY 原则