这个While 循环可以简化吗?

Aas*_*war 4 java string stack parentheses java-8

考虑以下代码。它用于检查字符串是否具有有效的括号但不使用堆栈。

public boolean isValid(String input) {
       
    while(input.length() != (input = input.replaceAll("\\(\\)|\\[\\]|\\{\\}", "")).length());
    return input.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)

但是有点难以理解。这可以简化吗?不添加更多新行?

k31*_*159 6

如果您首先格式化并正确缩进它会有所帮助:

public boolean isValid_2(String input) {
    while(input.length() != (input = input.replaceAll("\\(\\)|\\[\\]|\\{\\}", "")).length())
        ;
    return input.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)

接下来,请注意该方法不依赖于其类的实例,因此可以是静态的。此外,从正则表达式中删除多余的转义:

public static boolean isValid_3(String input) {
    while(input.length() != (input = input.replaceAll("\\(\\)|\\[]|\\{}", "")).length())
        ;
    return input.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)

最后,将复杂的语句分解成易于理解的部分,并引入一些名称有意义的变量,然后将循环类型更改为更有用的类型,您就拥有了最终版本:

public static boolean isValid_4(String input) {
    int oldLength, newLength;
    do {
        oldLength = input.length();
        input = input.replaceAll("\\(\\)|\\[]|\\{}", "");
        newLength = input.length();
    } while (oldLength != newLength);
    return input.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)