使用length()函数和布尔值的有效方法是什么?

时间:2014-07-30 06:21:13

标签: java methods

到目前为止,我已经了解了自己做示例项目的概念。但我需要知道使用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)引入新变量并使用该变量中的数据检查条件?

5 个答案:

答案 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");