我正在创建一个登录页面,用于将文本文件中的用户名和密码读入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);
}
}
我做到了! 谢谢大家的帮助,每条评论都非常有帮助和赞赏。
答案 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;
}