2014-03-28 53 views
1

我正在創建一個登錄系統,並希望爲我的代碼添加三個硬編碼登錄詳細信息。我目前有一個需要用戶名,密碼和學號才能登錄。當系統提示您在控制檯中輸入代碼時,條目必須與硬編碼的詳細信息匹配才能獲得身份驗證。我想再添加三個登錄信息,所以總共有四個。這是我目前的登錄系統。使用|| (或)或其他運營商?

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登錄。

+0

嘗試閱讀Java中的命名約定。很難閱讀你的代碼。 –

+0

您發佈的最後一個示例將起作用,只不過您忘記移動'{'。然而,做出一個有很多類似測試的「if」陳述並不是正確的編程方式。你一定要創建一些數據結構來保存允許的名稱/密碼/學號的列表。 cheseaux的回答是一個好的開始。 – ajb

+0

另外,也許這是顯而易見的,但在現實生活中,您不能將密碼硬編碼到程序中,因爲有人可以通過查看二進制文件來找到密碼。 – ajb

回答

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; 
    } 
} 

所以,你可以有UserArrayList<User>實例的類。然後,您可以輕鬆地遍歷此列表以查找任何匹配的憑據。

+0

甚至更​​好,在用戶ID上鍵入一個'Map'。 – ajb

-1

你很近。這是你正在尋找正確的布爾邏輯:

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

通知,EnteredStudentNumber2變量是一個字符串,所以你將不得不使用.Equals()。

第一個EnteredStudentNumber是一個整數,所以你可以使用==比較。

+0

編號他在比較EnteredStudentNumber變量(字符串與字符串比較)時使用了==運算符,正如我在文章中指出的那樣。 –

+0

是的,對不起,我沒有發現第二個數字被聲明爲'String'(但它可能是一個錯字?)。 – ajb

-1

正如其他人說,它是可能的或操作員(||

你想將你的檢查所有與周圍括號然後將字段或其他檢查,要做到這一點

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

但是,這可能不是一個好主意,因爲它非常容易出錯(你可能會在應該檢查StudentNumber43的塊中意外檢查StudentNumber4,因此你應該使用某種Iterable Data結構。可在多個List<String>,多個字符串數組String[]或封裝您UserInformation(List<User>User[]

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

+0

沒有其他人在沒有從任何東西擴展的類上使用'super()'嗎?我不。 :) – ajb

+0

每個類都從'對象' – cheseaux

+0

擴展我的意思是明確擴展。 – ajb