簡體   English   中英

檢查arraylist中的重復項

[英]Checking for duplicates in arraylist

我在檢查arraylist中的重復項時遇到麻煩。 這是有關其工作方式的實際事件順序:

  1. 由於arraylist為空,因此創建並存儲了帳戶(asdasd的登錄ID)。
  2. 如果再次創建具有相同登錄ID的帳戶,則該帳戶將不會存儲在陣列中,並且會顯示錯誤消息

有沒有更有效的方法來檢查類與類之間的重復項? 非常感謝

解決了


第二個問題:如果存在一串混合的非數字和數字字符,我將無法登錄。

方案1(登錄失敗):登錄ID:測試密碼:a1s2d3f4

方案2(登錄失敗):登錄ID:a1s2d3f4密碼:test

方案2(成功):登錄ID:測試密碼:測試

方案3(成功):登錄ID:asdasd123123密碼:asdasd123123

我認為問題在於向量中存儲的字符串的長度。 如何使矢量中存儲的所有數據都具有固定的長度/大小?

解決了


LoginPanel.class

...     
    else if (e.getSource() == registerB) {

        con = new Controller();

        String login = loginTF.getText();
        String pass = new String(passwordTF.getPassword());
        LoginRecord lr = new LoginRecord(login.trim(), pass.trim());

        int asd = con.checkRegisterData(lr);

         if(asd == 0){
            JOptionPane.showMessageDialog(null, "You've successfully created an account", "Notice", JOptionPane.INFORMATION_MESSAGE);
            loginTF.setText("");
            passwordTF.setText("");
        }

        else if(asd == 999){
            JOptionPane.showMessageDialog(null, "Please enter a Login ID or Password", "Error", JOptionPane.ERROR_MESSAGE);
        }

        else if (asd == 1){
            JOptionPane.showMessageDialog(null, "The Login ID already exists", "Error", JOptionPane.ERROR_MESSAGE);
        };


    }

    else if (e.getSource() == loginB) {

        String login = new String(passwordTF.getPassword());
        String pass = loginTF.getText();

        LoginRecord lr = new LoginRecord(login.trim(), pass.trim());

        con = new Controller();
        int asd = con.checkLoginData(lr);

        if(login.trim().isEmpty() && pass.trim().isEmpty()){    
            JOptionPane.showMessageDialog(null, "Please enter your Login ID and Password", "Error", JOptionPane.ERROR_MESSAGE);
        }

        else if(loginTF.getText().trim().equals("")){
            JOptionPane.showMessageDialog(null, "Please enter your Login ID", "Error", JOptionPane.ERROR_MESSAGE);
        }

        else if(pass.trim().equals("")){
            JOptionPane.showMessageDialog(null, "Please enter your Password", "Error", JOptionPane.ERROR_MESSAGE);
        }

        else if(asd == 0){
            main1.cardLayout.show(main1.cards, "personal");
        }

        else if(asd == 1){
            JOptionPane.showMessageDialog(null, "Please key in the correct Password or Login ID", "Error", JOptionPane.ERROR_MESSAGE);      
        }
        }   
}
}

Controller.class

    public Controller() {
    ds = new DataStorage();
}


public int checkRegisterData(LoginRecord lr) {

    // Checks to see if both text fields are empty or not
    if(lr.getLoginName().isEmpty() || lr.getPass().isEmpty()){
        result = 999;
    }
    // Array is empty
    else if(DataStorage.login.isEmpty()){
        ds.storeLoginData(lr);
        result = 0;
    }
    // There's no duplicate in the array
    else if(ds.checkLogin(lr) == false){
        ds.storeLoginData(lr);  
        result = 0;
    }       
    // There's a duplicate in the array
    else if(ds.checkLogin(lr) == true){
        result = 1;
    }
    return result;
}

public int checkLoginData(LoginRecord lr){

    boolean login = ds.checkLogin(lr);
    boolean pass = ds.checkPassword(lr);

    if (login && pass == true && true) {
        result1 = 0;
    }

    else {
        result1 = 1;
    }
    return result1;
}

}

DataStorage.class

公共類DataStorage {

public static Vector<LoginRecord> login = new Vector<LoginRecord>();

public boolean checkLogin(LoginRecord lr) {

    for(int i = 0; i<login.size(); i++){
        if(login.get(i).getLoginName().equalsIgnoreCase(lr.getLoginName())){
            return true; // Duplicate exists
        }
    }
    return false;
    }


public void storeLoginData(LoginRecord lr) {
    login.add(lr);
}

public boolean checkPassword(LoginRecord lr){
    for (int i = 0; i <login.size();i++){
        if(login.get(i).getPass().equalsIgnoreCase(lr.getPass())){
            return true; // Duplicate exists
        }
    }
    return false;
}

}

在你retrieveLoginData方法,你傳遞一個String的Logindata(用戶名?)和密碼(這是沒有意義的)。

您要檢查Vector存儲的Object(即LoginRecord )和String(永不相等)之間是否相等。

同樣,將密碼作為參數也是沒有意義的。

您要么要求存儲在LoginRecord中的用戶名相等,要么必須根據您的用戶名和密碼創建一個新的LoginRecord ,並要求新對象與所存儲的對象相等。 這是沒有意義的,因為如果有人嘗試使用相同的用戶名和不同的密碼創建用戶,那么它也將不相等。

現在,您編輯了一些內容,並獲得了LoginRecord作為參數。 但是您仍在要求LoginRecordlogin.get(i).equals )和字符串lr.getLoginname

您必須使login.get(i).getLoginName.equals(lr.getLoginName)

因此,總的來說,下面是代碼:

public boolean retrieveLoginData(LoginRecord lr) {

for(int i = 0; i<login.size(); i++){
    if(login.get(i).getLoginName.equals(lr.getLoginName)){
        return true;
    }
}
return false;
}

第二個問題:

您的問題是您在密碼檢查時正在檢查loginName,而您可能想在其中檢查密碼。

還有一個問題是,您正在檢查密碼和用戶名無關。 如果有人使用用戶名ABC和密碼DEF,又有人使用用戶名123和密碼456,則用戶可以使用兩種組合登錄(ABC:456和123:DEF可以使用)

public boolean checkLogin(LoginRecord lr) {

for(int i = 0; i<login.size(); i++){
    if(login.get(i).getLoginName().equalsIgnoreCase(lr.getLoginName())){
        return true; // Duplicate exists
    }
}
return false;
}


public boolean checkPassword(LoginRecord lr){
for (int i = 0; i <login.size();i++){
    if(login.get(i).getPass().equalsIgnoreCase(lr.getLoginName())){
        return true; // Duplicate exists
    }
}
return false;
}

您真正想要做的是同時詢問Usercredentials:

public boolean checkLogin(LoginRecord lr) {

for(int i = 0; i<login.size(); i++){
    if(login.get(i).getLoginName().equalsIgnoreCase(lr.getLoginName()) &&
            login.get(i).getPass().equalsIgnoreCase(lr.getPass())){
        return true; // Duplicate exists
    }
}
return false;
}

另外,如果您有時間閱讀有關安全性的更多信息,那么使用和保存密碼哈希將更加安全。 但是,如果您只是在四處閑逛而又想學習一切,那應該沒問題。

使用Map可以讓您使用其ID作為鍵來存儲帳戶,然后可以使用Map.containsKey()檢查是否存在具有特定ID的帳戶。

它非常簡單,使用ArrayList contains()

ArrayList login=new ArrayList();
if(login.contains(loginTF.getText())==false)
{
login.add(loginTF.getText());
}
else
{
//show your error

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM