检查arraylist中的重复项

时间:2014-08-02 16:16:32

标签: java arraylist duplicates

我在检查我的arraylist中的重复项时遇到了麻烦。这是关于它应该如何工作的事件的实际顺序:

  1. 创建并存储帐户(asdasd的登录ID),因为arraylist为空。
  2. 如果再次创建具有相同登录ID的帐户,该帐户将不会存储在数组中,并会显示错误
  3. 是否有更有效的方法来检查从一个类到另一个类的重复项?非常感谢

    解决


    第二个问题:如果有一串混合的非数字和数字字符,我将无法登录。

    场景1(登录失败): 登录ID:测试 密码:a1s2d3f4

    场景2(登录失败): 登录ID:a1s2d3f4 密码:测试

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

    }

3 个答案:

答案 0 :(得分:1)

retrieveLoginData方法中,您为Logindata(用户名?)和密码(没有意义)传递String

检查存储在Vector中的对象(LoginRecord)与字符串之间是否相等。

将密码作为参数也没有意义。

您要求存储在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;
}

您真正想要做的是同时要求提供用户凭证:

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

此外,如果您有时间阅读有关安全性的更多信息,那么使用和保存密码的哈希将更安全。但是,如果你只是搞乱并且想要学习所有东西,那么你应该没问题。

答案 1 :(得分:0)

使用Map可以使用他们的ID作为密钥存储您的帐户。然后,您可以使用Map.containsKey()检查帐户是否已存在具有特定ID的帐户。

答案 2 :(得分:0)

非常简单,使用ArrayList contains()

例如

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

}