使用|| (或)或其他运营商?

时间:2014-03-28 16:06:10

标签: java loops if-statement login

我正在创建一个登录系统,并希望在我的代码中添加三个硬编码的登录详细信息。我目前有一个需要用户名,密码和学号才能登录。当提示在控制台中输入代码时,条目必须与硬编码的详细信息匹配才能获得身份验证。我想再添加三个登录详细信息,总共会有四个。这是我目前的登录系统;

    final String UserID = "TomDeponeo"; 
    final String Password = "LJMU";
    final int StudentNumber = 22334455;


    String EnteredUserID; 
    String EnteredPassword;
    int EnteredStudentNumber;
    for (int s = 0; s <= 3; s++) { 
        if (s < 3) { 
            System.out.println("Enter your UserID to access lift;"); 
            EnteredUserID = console.nextLine();
            System.out.println("Your UserID is >>> " + EnteredUserID);
            System.out.println("Enter your password to authenticate login;");
            EnteredPassword = console.nextLine();
            System.out.println("Password Entered is >>> " + EnteredPassword);
            System.out.println("Enter your student number to finalise login and authentication;");
            EnteredStudentNumber = console.nextInt();
            System.out.println("Student Number Entered is >>> " + EnteredStudentNumber);
            if (UserID.equals(EnteredUserID) && (Password.equals(EnteredPassword)) 
                    && (StudentNumber == EnteredStudentNumber)) {
                System.out.println("Athentication complete!");
                System.out.println("***Elevator access granted!***");
                System.out.println("Welcome..."); 
                Elevator a = new Elevator(); 
                Elevator.selectFloor();
                break;

            } else {
                System.out.println("Wrong UserID, Password or Student Number. Please try again."); 
            }
        } else {
            System.out.println("3 incorrect enteries detected. Access Denied!"); 
        }
    }
}

我目前只有一组登录详细信息,但想添加更多。这是我的意思的一个例子;

final String UserID = "TomDeponeo"; 
final String Password = "LJMU";
final int StudentNumber = 22334455;

final String UserID2 ="Secondname";
final String Password2 = "Secondpassword";
final String StudentNumber2 = "123456";

//etc...

String EnteredUserID2; 
String EnteredPassword2;
int EnteredStudentNumber2;

//etc...

此问题的主要部分涉及将其他可能的登录详细信息添加到登录系统。我是否需要使用||来允许其他可能的条目?其他细节将在此处添加;

if (UserID.equals(EnteredUserID) && (Password.equals(EnteredPassword)) 
                    && (StudentNumber == EnteredStudentNumber)) {

可能会这样吗?

if (UserID.equals(EnteredUserID) && (Password.equals(EnteredPassword)) 
      && (StudentNumber == EnteredStudentNumber)) {
      || (UserID2.equals(EnteredUserID2) && (Password2.equals(EnteredPassword2)) 
      && (StudentNumber2 == EnteredStudentNumber2))

登录时只需要一组可能的4次登录。

4 个答案:

答案 0 :(得分:5)

这是为什么在这种情况下需要对象编程的一个很好的例子。

您应该创建一个包含三个字段的类,即

class User {

    String userID; 
    String password;
    int studentNumber;

    public User(String userID, String pass, int number) {
        this.userID = userID;
        this.password = pass;
        this.studentNumber = number;
    }
}

这样您就可以拥有ArrayList<User>User个实例。然后,您可以轻松地遍历此列表以查找任何匹配的凭据。

答案 1 :(得分:1)

我会使用一个很好的对象:

public class Credentials {

    private final String name;
    private final String password;
    private final String studentNumber;

    public Credentials(String name, String password, String studentNumber) {
        super();
        this.name = name;
        this.password = password;
        this.studentNumber = studentNumber;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (getClass() != obj.getClass())
            return false;
        Credentials other = (Credentials) obj;
        if (!this.name.equals(other.name)) {
            return false;
        }
        if (!this.password.equals(other.password)) {
            return false;
        }
        if (!this.studentNumber.equals(other.studentNumber)) {
            return false;
        }
        return true;
    }

}

在你的测试班中:

private static final Credentials[] cred = {
    new Credentials("TomDeponeo", "LJMU", "22334455"),
    new Credentials("Secondname", "Secondpassword", "123456"),
    /* ... */
};

然后测试输入的凭据:

public static boolean checkForCredentials(String EnteredUserID, String EnteredPassword, String EnteredStudentNumber) {
    Credentials entered = new Credentials(EnteredUserID, EnteredPassword, EnteredStudentNumber);

    for (Credentials creds : validCredentials) {
        if (creds.equals(entered)) {
            return true;
        }
    }
    return false;
}

使用此功能,您可以获得未定义数量的硬编码凭据,而无需触及逻辑。请注意,我已覆盖equals但未覆盖hashCode。例如,在现实世界中,您始终要覆盖hashCodeequals或不覆盖。

答案 2 :(得分:-1)

你很亲密。这是您正在寻找的正确布尔逻辑:

if ((UserID.equals(EnteredUserID) && Password.equals(EnteredPassword) && StudentNumber == EnteredStudentNumber) 
|| (UserID2.equals(EnteredUserID2) && Password2.equals(EnteredPassword2) && StudentNumber2.Equals(EnteredStudentNumber2)))

注意,EnteredStudentNumber2变量是一个字符串,因此您必须使用.Equals()。

第一个EnteredStudentNumber是一个整数,因此您可以使用== comparison。

答案 3 :(得分:-1)

正如其他人所说,可以使用或运算符(||

执行此操作

您可能希望将所有字段的支票分组,然后围绕它们进行分组,或者进行其他检查

    if ((UserID.equals(EnteredUserID) && (Password.equals(EnteredPassword)) && (StudentNumber == EnteredStudentNumber))
            || (UserID2.equals(EnteredUserID) && (Password2.equals(EnteredPassword)) && (StudentNumber2 == EnteredStudentNumber))
            [...]
            )

然而,这可能不是一个好主意,因为它非常容易出错(您可能会意外地检查一个应该检查StudentNumber43的块中的StudentNumber4,因此您应该使用某种可重复数据结构。这可能是多个List<String>,多个字符串数组String[]或封装UserInformation(List<User>User[])的对象列表