繁体   English   中英

Java“包含”无法正常工作

[英]Java “contains” not working properly

我的课:

public class UserProgressModel {

    private String email;

    public UserProgressModel(String pEmail) {
        super();

        this.email = pEmail;
    }

    @Override
    public boolean equals(Object x) {

        if (x != null && x instanceof UserProgressModel
                && ((UserProgressModel) x).email.equals(this.email) == true) {

            return true;
        }

        if (x != null && x instanceof String
                && x.equals(this.email) == true) {

            return true;
        }

        return false;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + (this.email != null ? this.email.hashCode() : 0);
        return hash;
    }
}

在通过gson放置一些对象之后:

UserProgressModel[] userProgressArray;
List<UserProgressModel> retUserProgress = new ArrayList<>();

userProgressArray = gs.fromJson(fileContents,
                        new TypeToken<UserProgressModel[]>() {
                        }.getType());

for (UserProgressModel ele : userProgressArray) {

    if (ele != null) {
        retUserProgress.add(ele);
    }
}

我无法得到以下代码:

retUserProgress.contains("test@test.com");

我遍历数组以验证一个对象是否有电子邮件。

我做对了吗? 我想我已经覆盖了equals和hashcode。

您的equals实现不正确。 如果您查看相等合同,则实现必须是对称的:

... for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true. 

在您的情况下,您有一个UserProgressModel对象的列表,但是您尝试与String进行比较。 在实现UserProgressModel.equals(String)之后,您仍然需要让String.equals(UserProgressModel)返回正确的结果。 由于您无法执行此操作,因此该实现永远不会在所有情况下都有效。 您应该做的两件事:

删除String的check in equals,因为它将永远无法使用。

使用模拟对象检入集合:

retUserProgress.contains(new UserProgressModel("test@test.com"));

只要您自己的类型(UserProgressModel.equals(UserProgressModel))中的equals方法正确,就可以解决您的问题。

您不能检查retUserProgress是否包含电子邮件,因为它不包含。 ArrayList包含类:UserProgressModel的对象,因此您可以检查ArrayList是否包含“ UserProgressModel”。

您想做的是以下几点

private boolean containsEmail(List<UserProgressModel> retUserProgress, String email) {
    boolean result = false;

    for (UserProgressModel object : retUserProgress) {
        if (object.equals(email))
            result = true;
    }

    return result;
}

然后调用方法如下:

containsEmail(retUserProgress, "test@test.com"); //This will return a true or false, depending if the ArrayList retUserProgress contains the email

我已经在ideone中测试了您的代码

它正在工作

真正

UserProgressModel model=new UserProgressModel("test@test.com");
System.out.print(model.equals("test@test.com"));

UserProgressModel model=new UserProgressModel("test@test.com");
System.out.print(model.equals("test@test.co"));

尝试与新对象进行比较

retUserProgress.contains(new UserProgressModel("test@test.com"))

结果

如果您不想与新的UserProgressModel进行比较,则需要创建自己的列表类型,当它比较两个对象(UserProgressModel,字符串)时,它会创建一个新的UserProgressModel并为其传递电子邮件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM