【问题标题】:Using || (or) or other operator?使用 || (或)或其他运算符?
【发布时间】:2014-03-28 16:06:10
【问题描述】:

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

    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))

只需 1 组可能的 4 次登录即可登录。

【问题讨论】:

  • 尝试阅读 Java 中的命名约定。很难阅读您的代码。
  • 您发布的最后一个示例将有效,只是您忘记移动{。然而,用大量类似的测试制作一个大的if 语句并不是正确的编程方式。您肯定想创建某种数据结构来保存允许的姓名/密码/学生编号列表。 cheseaux 的回答是一个好的开始。
  • 另外,这可能很明显,但在现实生活中,您不能将密码硬编码到程序中,因为有人可以通过查看二进制文件找到密码。

标签: java loops if-statement login


【解决方案1】:

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

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

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&lt;User&gt;User 实例。然后,您可以轻松地遍历此列表以查找任何匹配的凭据。

【讨论】:

  • 或者更好的是,Map 键入用户 ID。
【解决方案2】:

我会使用一个不错的对象:

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 或不覆盖。

【讨论】:

  • 还有其他人在没有从任何东西扩展的类上使用super() 吗?我不。 :)
  • 每个类都是从Object扩展而来的
  • 我的意思是明确扩展。
【解决方案3】:

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

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

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

第一个 EnteredStudentNumber 是一个整数,所以可以使用 == 比较。

【讨论】:

  • 没有。正如我在帖子中指出的那样,他在比较 EnteredStudentNumber 变量(字符串到字符串比较)时使用了 == 运算符。
  • 是的,抱歉,我没有发现第二个数字被声明为String(但这可能是一个错字?)。
【解决方案4】:

正如其他人所说,使用 or 运算符 (||) 可以做到这一点

您可能希望对所有带有括号的字段的检查进行分组,然后对其他检查进行分组

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

但是,这可能不是一个好主意,因为它很容易出错(您可能会不小心在应该检查 StudentNumber43 的块中检查 StudentNumber4,因此您应该使用某种可迭代数据结构。这可以是多个List&lt;String&gt;、多个字符串数组 String[] 或封装您的 UserInformation 的对象列表(List&lt;User&gt;User[]

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 2010-11-12
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多