这个While循环可以简化吗?

Can this While loop be simplified?

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

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

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

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

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

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

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

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

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();
}

注:我回答完问题后更新了问题。所以,如果不能满足问题答案的各个方面,那么请忽略它

让我们看看:

public boolean isValid(String input) {
    
    int prevLength = input.length();

    input = input.replaceAll("\(\)|\[\]|\{\}", "");
    
    while(prevLength != input.length()) {
        prevLength = input.length();
        input = input.replaceAll("\(\)|\[\]|\{\}", "");
    }
    
    return input.isEmpty();
}

我想它已经足够简化了...

我的简化是这样的:

static boolean isValid(String input) {
    String t = input, s;
    do {
        s = t;
        t = s.replaceAll("\(\)|\[\]|\{\}", "");
    } while (s.length() != t.length());
    return t.isEmpty();
}   

这虽然更长,但让 IMO 更容易看到发生了什么。我喜欢简洁,但并不总是最好的。

这与其他简化答案的不同之处在于,它更多地关注剩余的字符串而不是长度,在我看来,长度更重要。但在某些时候,这是一个审美问题。

(此外,您可以方便地在循环中的赋值后粘贴“打印”,以查看真正发生的情况 - 我这样做是为了调试我的错误评论)