gpt4 book ai didi

java - 检查数组列表中的重复项

转载 作者:行者123 更新时间:2023-12-01 12:41:02 25 4
gpt4 key购买 nike

我在检查数组列表中的重复项时遇到问题。以下是其工作原理的实际事件顺序:

  1. 由于 arraylist 为空,因此创建并存储了帐户(asdasd 的登录 ID)。
  2. 如果再次创建具有相同登录ID的帐户,该帐户将不会存储在数组中,并且会显示错误

是否有更有效的方法来检查类之间的重复项?非常感谢

已解决

<小时/>

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

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

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

场景 2(成功):登录ID:测试密码:测试

场景 3(成功):登录ID:asdasd123123密码:asdasd123123

我认为问题在于 vector 中存储的字符串的长度。如何使存储在 vector 中的所有数据都具有固定的长度/大小?

已解决

<小时/>

登录面板.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 类

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

}

数据存储.class

公共(public)类数据存储{

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 作为登录数据(用户名?)和一个密码(这没有意义)。

您检查存储在 Vector 中的对象(它是一个 LoginRecord)与字符串(永远不相等)之间是否相等。

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

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

现在您编辑了一些内容,您将获得一个 LoginRecord 作为参数。但您仍然要求 LoginRecord (login.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;
}

第二个问题:

您的问题是您在密码检查时检查登录名,而您可能想在检查密码时检查登录名。

还有一个问题是,您正在检查的密码和用户名无关。如果有人使用用户名 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;
}

此外,如果您有时间阅读有关安全性的更多信息,那么使用和保存密码的哈希值会更安全。但如果你只是闲逛并想学习一切,那应该没问题。

关于java - 检查数组列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com