我在检查我的arraylist中的重复项时遇到了麻烦。这是关于它应该如何工作的事件的实际顺序:
是否有更有效的方法来检查从一个类到另一个类的重复项?非常感谢
解决
第二个问题:如果有一串混合的非数字和数字字符,我将无法登录。
场景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;
}
}
答案 0 :(得分:1)
在retrieveLoginData
方法中,您为Logindata(用户名?)和密码(没有意义)传递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;
}
第二个问题:
您的问题是您正在检查密码检查中的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
}