java - Java 匹配外括号太慢

标签 java performance

我需要选择两个外括号之间的所有文本。由于正则表达式无法保证选择匹配的括号,因此我编写了以下代码:

public static String getContentBetweenCorresponding(String s, char left, char right) {
    int pos = s.indexOf(left);
    if ( pos > -1 ) {
        int start = pos;
        int openCount = 0;
        while ( pos < s.length() ) {
            char currentChar = s.charAt(pos);
            if ( currentChar == right ) {
                if ( openCount > 1 ) // if openCount == 1 then correct one 
                    openCount--;
                else
                    return s.substring(start + 1, pos);
            } else if ( currentChar == left )
                openCount++;
            pos++;
        }
    }
    return null;
}

它有效。然而它非常慢。我怎样才能加快速度?此方法需要 5 秒来处理手头的字符串,这是我的应用程序的瓶颈。

提前非常感谢!

编辑: 我想做的是将文本放在匹配的括号之间。

getContentBetweenCorresponding("bla{{{blubb}}}}}}", '{', '}')

应该返回

"{{blubb}}"

最佳答案

您编写的方法没有任何明显的低效率。我的猜测是问题实际上在于以下之一:

  1. 您可能会针对同一个字符串 s 多次调用此函数,而您可以只调用一次并存储结果。
  2. 您可能会向此方法传递非常大的字符串,并且字符串开头和右大括号之间的距离非常大。

如果您的实际输入预计 {} 之间的距离较大,您可以重写该方法以使用 indexOf 直接查找 leftright,而不是测试每个字符的 charAt。在这种情况下,对 indexOf 的调用比对 charAt 的调用要少得多,而且最外层大括号之间的字符串中的字符将被检查至少两倍于内部大括号之间的字符。 indexOf 的实现可能会超出 JIT 使用 charAt 执行的性能。

关于java - Java 匹配外括号太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138820/

相关文章:

java - 有没有办法弄清楚windows上的java时间片?

java - 泛型和原始类型

java - 如何在android中的listview中显示html内容?

javascript - 如何使 JavaScript 动画响应式?

python - 查找列表中每个字符串之间的最大差异

java - 在 java 中使用 getResource() 读取路径名中包含空格的文件时出现尴尬的结果

c# - C# 真的比说 C++ 慢吗?

c# - 如何在内存中初始化测试并在每个测试中使用

c# - 如何在asp.net mvc中进行一些性能测试?

java - 当用户在 setOnPreferenceChangeListener 中选择否定按钮时关闭确认对话框