Java ArrayList包含不返回预期结果的方法

时间:2015-09-20 20:00:33

标签: java arraylist equals

我正在对名为“用户”的Arraylist<object>创建一个简单的检查。 users对象具有用户名和密码字段。我正在创建一个删除用户的方法,但它没有返回所需的结果。

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;
}

**** **** EDIT 等于覆盖在超类“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()));
    }
}

有没有更好的方法可以覆盖equals以使此代码有效?感谢您的回复,我确实尝试了if(users.toString().contains(in.nextLine())),并给出了预期的结果。我的toString()覆盖返回this.username;我也在这里做了错误的调用users.remove(this);

1 个答案:

答案 0 :(得分:1)

假设in.nextLine()返回Stringusers.contains()将永远不会返回true,因为您的User对象的equals方法会产生{{1}当你传递任何字符串时。

要解决此问题,请立即致电false,并将结果与​​remove进行比较,以决定打印输出:

null

请注意,这会删除当前用户,而不是User removed = users.remove(this); if (removed == null) { System.out.println("There is not a user with that name"); } 字符串标识的用户。如果您希望通过某个字符串名称来保持用户的组织,请使用in.nextLine()而不是列表。