这个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 更容易看到发生了什么。我喜欢简洁,但并不总是最好的。
这与其他简化答案的不同之处在于,它更多地关注剩余的字符串而不是长度,在我看来,长度更重要。但在某些时候,这是一个审美问题。
(此外,您可以方便地在循环中的赋值后粘贴“打印”,以查看真正发生的情况 - 我这样做是为了调试我的错误评论)
考虑以下代码。它用于检查字符串是否具有有效括号但不使用堆栈。
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 更容易看到发生了什么。我喜欢简洁,但并不总是最好的。
这与其他简化答案的不同之处在于,它更多地关注剩余的字符串而不是长度,在我看来,长度更重要。但在某些时候,这是一个审美问题。
(此外,您可以方便地在循环中的赋值后粘贴“打印”,以查看真正发生的情况 - 我这样做是为了调试我的错误评论)