我的课程:
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");
我通过数组循环验证一个对象是否有电子邮件。
我做对了吗?我想我已经超越了平等和哈希码。
答案 0 :(得分:5)
您的equals实现不正确。如果你看一下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的检查,因为它永远不会起作用。
使用模拟对象签入集合:
retUserProgress.contains(new UserProgressModel("test@test.com"));
只要您的equals方法在您自己的类型(UserProgressModel.equals(UserProgressModel))中是正确的,这应该可以解决您的问题。
答案 1 :(得分:0)
您无法检查retUserProgress是否包含电子邮件,因为它不包含。 ArrayList包含Class: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
答案 2 :(得分:-2)
我已经在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,string)时,它会创建一个新的UserProgressModel并为其传递该电子邮件