2015-09-20 64 views
-1

我正在創建一個名爲「users」的Arraylist<object>的簡單檢查。用戶對象具有用戶名和密碼字段。我正在創建一個方法來刪除一個用戶,它不會返回所需的結果。Java ArrayList包含不返回預期結果的方法

public void remove(){ 
    if(users.contains(in.nextLine())) //if ArrayList contains username you want to remove 
     users.remove(this); 
    else 
     System.out.println("There is not a user with that name"); 
} 

問題是,當我輸入相同的準確的用戶名,因爲這是已經在ArrayList中,它仍返回else語句的用戶的用戶名。我有一個預感,那是因爲我的equals/hashcode overrides繼承自它的類。它們只是Eclipse生成的通用類。

public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    UserAccount other = (UserAccount) obj; 
    if (username == null) { 
     if (other.username != null) 
      return false; 
    } else if (!username.equals(other.username)) 
     return false; 
    return true; 
} 

**** ****編輯 的Equals超控處於超類 「UserAccount」。我創建了一個繼承UserAccount的「FacebookUser」類,然後創建了繼承FacebookUser的「Facebook」類。 「Facebook」類是我的方法所在。每一個構造函數是

UserAccount(String username, String password){ 
    this.username = username; 
    this.password = password; 
} 
Facebook(String username, String password){ //FacebookUser the same 
    super(username, password); 
} 

,他們用這種方法

public void add(){ 
    System.out.println("Add username.."); 
    if(users.contains(username = in.nextLine())) 
     System.out.println("Already a user of that name"); 
    else { 
     System.out.println("Add password.."); 
    users.add(new Facebook(username, in.nextLine())); 
    } 
} 

有沒有更好的辦法,我可以重寫等於使此代碼工作添加到列表中?感謝您的回覆,我嘗試了if(users.toString().contains(in.nextLine())),並得到了期望的結果。我的toString()重寫返回this.username;此外,我做出了錯誤的來電來訪users.remove(this);

+0

您尚未發佈足夠的代碼。我假設你有一個UserAccounts的列表,但你正在檢查它是否包含指定的字符串。因此你的equals總是返回false – Gaskoin

+0

你檢查'users'是否包含'String',但是刪除'this'?什麼是'用戶'?什麼是'這個'? –

+0

您的文章缺少一些可以阻止我們幫助您的事情:ArrayList的聲明,您將其放入列表的類以及equals方法,以及您是否正在調用其超類的equals。目前還不清楚你發佈的等於你的代碼的位置是否適合你的代碼 – AfterWorkGuinness

回答

1

假設in.nextLine()返回Stringusers.contains()不會返回true,因爲你的User對象的equals方法產生false當你傳遞的任何字符串。

爲了解決這個問題,請致電remove馬上,結果比較null到打印輸出的決定:

User removed = users.remove(this); 
if (removed == null) { 
    System.out.println("There is not a user with that name"); 
} 

注意,這將刪除當前用戶,而不是由in.nextLine()字符串標識的用戶。如果您想讓用戶按某個字符串名稱組織,請使用Map<String,User>而不是列表。

+0

謝謝你的回答讓我想通了。我通過一個對象,而現在它的工作。我現在看到它在equals方法中失敗了。 –