到目前为止,我已经了解了自己做示例项目的概念。但我需要知道使用length()函数和boolean的有效方法是什么。以下是两种可能情况的代码。
案例1:
String userName_Pattern = "[a-zA-Z]*[0-9]*";
do {
System.out.println("PREFERRED USERNAME (Only 6 - 14 characters)");
new_UserName = br.readLine();
if(new_UserName.matches(userName_Pattern)!=true) {
System.out.println("Username must contain only letters and numbers");
}
if(new_UserName.length()==0) {
System.out.println("Username cannot be blank");
}
}while((new_UserName.matches(userName_Pattern)!=true)||(!((new_UserName.length()>5)&&(new_UserName.length()<15))));
案例2:
String userName_Pattern = "[a-zA-Z]*[0-9]*";
boolean b;
int userName_Length;
do {
System.out.println("PREFERRED USERNAME (Only 6 - 14 characters)");
new_UserName = br.readLine();
b=new_UserName.matches(userName_Pattern);
userName_Length=new_UserName.length();
if(b!=true) {
System.out.println("Username must contain only letters and numbers");
}
if(userName_Length==0) {
System.out.println("Username cannot be blank");
}
}while((b!=true)||(!((userName_Length>5)&&(userName_Length<15))));
两种情况的逻辑和结果是相同的,但效率是多少?
1)在条件中直接使用length()和boolean?
或
2)引入新变量并使用该变量中的数据检查条件?
答案 0 :(得分:1)
两种情况都不完美。
String userName_Pattern = "[a-zA-Z0-9]{6,14}";
我假设你不需要所有数字都在所有数字之前?!
do {
System.out.println("PREFERRED USERNAME (Only 6 - 14 characters)");
new_UserName = br.readLine();
userName_Length=new_UserName.length();
correct = true;
if( userName_Length < 6 || userName_Length > 14 ){
System.out.println("Username must contain 6 - 14 ...");
correct = false;
} else
if(! new_UserName.matches(userName_Pattern) ) {
System.out.println("Username must contain only letters and numbers");
correct = false;
}
} while( ! correct );
实际上,您可以删除长度检查,因为修改后的模式也会捕获长度错误。
do {
System.out.println("PREFERRED USERNAME (Only 6 - 14 letters and digits)");
new_UserName = br.readLine();
correct = true;
if(! new_UserName.matches(userName_Pattern) ) {
System.out.println("Username must contain only letters and numbers, min 8, max 14");
correct = false;
}
} while( ! correct );
答案 1 :(得分:1)
它们的都不是特别有效:两者都可以得到显着改善。您不需要在循环中调用matches()两次;你不需要明确地将布尔值与'true'进行比较;如果已经使matches()测试失败,则不需要测试长度;等等等。
另一方面,它根本不需要任何优化,因为用户输入是速率确定步骤。但是无论如何我会清理它,因为它只是质量差的代码。通过更好地使用正则表达式,您可以简化整个过程:
final String userName_Pattern = "[a-zA-Z0-9]{6,14}";
for (;;)
{
System.out.println("PREFERRED USERNAME (Only 6 - 14 characters)");
new_UserName = br.readLine();
if (new_UserName == null)
break; // User ended the conversation
if (!new_UserName.matches(userName_Pattern)) {
System.out.println("Username must contain only letters and numbers and be between 6 and 14 characters in length");
}
else
break;
}
答案 2 :(得分:0)
你不需要为此引入一个局部变量,它可能会降低性能,但今天很可能的编译器会优化它们。
如果表达式的类型为boolean
,则无需将其与true
进行比较:
boolean b = ...;
if (b)
System.out.println("b is true");
else
System.out.println("b is false");
同样String
有一个isEmpty()
方法,你更喜欢测试0长度:
String s = "";
if (s.isEmpty())
System.out.println("String has 0 length.");
答案 3 :(得分:0)
就个人而言,我写的如下:
String askForUsername() {
for (;;) {
String userName = ...;
String validationMessage = validateUserName(userName);
if (validationMessage == null) {
return userName;
} else {
display(validationMessage);
}
}
}
String validateUserName(String userName) {
if (...) {
return "Username can not be blank";
} else if (...) {
return "Username must be between 6 and 14 characters long";
} else if (...) {
return "Username must contain only letters and numbers";
}
return null;
}
或者,validateUserName()
可能会抛出异常。这将更加惯用,但需要更多代码。
答案 4 :(得分:0)
我会更简短地表达一下:
System.out.println("PREFERRED USERNAME (Only 6 - 14 characters)");
String new_UserName = null;
for (new_UserName = br.readLine(); !new_UserName.matches("[a-zA-Z0-9]{6,14}"); new_UserName = br.readLine())
System.out.println("Username must contain only letters and numbers, min 6, max 14");