从arraylist读取以检查它是否包含用户名和密码

时间:2017-03-20 10:22:19

标签: java string arraylist

我正在创建一个登录页面,用于将文本文件中的用户名和密码读入arraylist。然后它会检查arraylist以查看它是否包含用户名和密码。出于某种原因,我无法弄清楚为什么如果它包含它就不会返回true。我认为问题在于每个索引中有多个字符串,但我不知道如何检查它是否只包含一个。 任何帮助,将不胜感激。它在JFrame GUI中。

登录按钮。

  private ArrayList<String> users = new ArrayList<String>();

  private void loginBtnActionPerformed(java.awt.event.ActionEvent evt) {                                         

    username = loginUsernameTxt.getText();
    password = String.valueOf(loginPasswordTxt.getPassword());
    if (username.equals("") || password.equals("")) {
        JOptionPane.showMessageDialog(frame, "No username or password entered.");
    } else {
        for (int i = 0; i < users.size(); i++) {
            if (users.get(i).contains(username) && users.get(i).contains(password)) {
                JOptionPane.showMessageDialog(frame, "Login is successful!");

            } else {
                JOptionPane.showMessageDialog(frame, "Username or password does not match. Please try again.");
            }
        }
    }
}            

注册按钮

    BufferedWriter output = new BufferedWriter(new FileWriter(file, true)); // instantiate my buffered write and file write also open it in append mode.
    try {
        Scanner myScanner = new Scanner(file);
        int line = 0;
        while (myScanner.hasNextLine()) {
            String checkUser = myScanner.nextLine();
            line++;
            if (checkUser.contains(username)) {
                JOptionPane.showMessageDialog(frame, "Username already in use, please try another.");
                uniqueUsername = false;
                break;
            }

        }
        if (uniqueUsername == true) {
            output.write("Usernames: " + username);
            output.newLine();
            output.write("Passwords: " + password);
            output.newLine();
            output.close();
        }

感谢您到目前为止的解决方案,我觉得哈希地图是正确的方法,但我不知道如何将它们全部添加到它。 到目前为止,这是我必须添加到arraylist。 如何将所有用户名和密码添加到哈希映射中? 先感谢您。

  try {

        try (Scanner myScanner = new Scanner(file)) {
            while(myScanner.hasNextLine()){
                users.add(myScanner.nextLine());
            }
        myScanner.close();
        }
}   catch (FileNotFoundException ex) {
       Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
    }

}

我做到了! 谢谢大家的帮助,每条评论都非常有帮助和赞赏。

2 个答案:

答案 0 :(得分:0)

您使用的是错误的数据结构,例如,如果您使用List存储用户名和密码, 您将无法区分哪个用户设置了密码,即您无法映射(关联)它们。

因此,您需要的是Map(外观here),它将数据存储为关键字&amp;价值对(例如您的用户名和密码),因此您需要使用Map代替List,如下所示代码和评论:

 //declare a Map key is username and value is password
 private Map<String, String> users = new HashMap<>();

 private void loginBtnActionPerformed(
         java.awt.event.ActionEvent evt) {                                         
    username = loginUsernameTxt.getText();
    password = String.valueOf(loginPasswordTxt.getPassword());
    if (username.equals("") || password.equals("")) {
                JOptionPane.showMessageDialog(frame, 
                     "No username or password entered.");
            } else {

                //retrive the value from Map using get(key)
                if (users.get(username) != null && 
                users.get(username).equals(password)) {
                    JOptionPane.showMessageDialog(frame, 
                           "Login is successful!");

                 } else {
                    JOptionPane.showMessageDialog(frame, 
                     "Username or password does not match. 
                           Please try again.");
               }
          }
    }  

您可以将值设置为users Map,如下所示:

users.put(username,password);

另外,要检查用户名是否已存在:

users.containsKey(username)

答案 1 :(得分:0)

如果你使用的是JPasswordField,那么你可能会得到这样的密码

/**
 * @return the password
 */
public String getPassword() {

    String password = null;
    if (this.loginPasswordTxt == null) return null;

    char[] buffer = this.loginPasswordTxt.getPassword();
    password = new String();

    for (char c : buffer) {
        password += c;
    }

    return password;
}

您的列表包含用户名和密码很奇怪为什么不使用HashMap

所以在这里,如果我非常好地使用user.get(i)应该是用户名+密码的串联,如果你把它放在工作cus

users.add(username)
users.add(password)
if (users.get(i).contains(username) && users.get(i).contains(password)){
 // never goes true
}

users.add(username + password)
if (users.get(i).contains(username) && users.get(i).contains(password)){
 // should be good
 break;
}

最佳解决方案是

HashMap<String, String> users = new HashMap<>();
users.put(uesrname, password);
if(users.get(username) != null && users.get(username).equals(password)){
   // connected
   break;
}