2015-09-20 69 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方法中失败了。 –