[英]Checking for duplicates in arraylist
我在檢查arraylist中的重復項時遇到麻煩。 這是有關其工作方式的實際事件順序:
有沒有更有效的方法來檢查類與類之間的重復項? 非常感謝
解決了
第二個問題:如果存在一串混合的非數字和數字字符,我將無法登錄。
方案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);
}
}
}
}
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;
}
}
在你retrieveLoginData
方法,你傳遞一個String
的Logindata(用戶名?)和密碼(這是沒有意義的)。
您要檢查Vector
存儲的Object(即LoginRecord
)和String(永不相等)之間是否相等。
同樣,將密碼作為參數也是沒有意義的。
您要么要求存儲在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;
}
您真正想要做的是同時詢問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;
}
另外,如果您有時間閱讀有關安全性的更多信息,那么使用和保存密碼哈希將更加安全。 但是,如果您只是在四處閑逛而又想學習一切,那應該沒問題。
使用Map可以讓您使用其ID作為鍵來存儲帳戶,然后可以使用Map.containsKey()
檢查是否存在具有特定ID的帳戶。
它非常簡單,使用ArrayList contains()
例
ArrayList login=new ArrayList();
if(login.contains(loginTF.getText())==false)
{
login.add(loginTF.getText());
}
else
{
//show your error
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.