检查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);      
        }
        }   
}
}

控制器类

    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方法中,您传递一个StringLoginData(用户名?)和一个密码(没有意义)。

您检查存储在中的Object Vector(是LoginRecord)和String(永远不会相等)之间的相等性。

同样,将密码作为参数也是没有意义的。

您要么要求存储在中的用户名相等,要么LoginRecord必须LoginRecord根据您的用户名和密码创建一个新的用户名,然后要求新对象与所存储的用户名之间相等。这是没有意义的,因为如果有人尝试使用相同的用户名和不同的密码创建用户,那么它也将不相等。

现在,您编辑了一些内容,并获得了LoginRecordas参数。但是您仍然要求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;
}

另外,如果您有时间阅读有关安全性的更多信息,那么使用和保存密码哈希将更加安全。但是,如果您只是在四处闲逛而又想学习一切,那应该没问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章