我制作了一个名为Coordinate的类,如下所示:
public class Coordinate {
public int x;
public int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
Coordinate coordinate = (Coordinate)obj;
return (coordinate.x == this.x && coordinate.y == this.y);
}
}
我有两个集合(A和B),分别填充了Coordinate类的实例。我想测试我的两个集合是否包含满足.equals()的Coordinate实例。例如:
Coordinate a = new Coordinate(2, 2);
Coordinate b = new Coordinate(2, 2);
A.add(a);
B.add(b);
即使a.equals(b)和b.equals(a)都等于true,a和b是不同的实例(因此分配给不同的内存位置),因此比较集A和我遇到的B会将它们评估为不同的集合。
有没有一种方法可以根据集合的内容是否满足.equals()来评估集合是否相等?
答案 0 :(得分:1)
如果您的Set
是HashSet
,则您忘记覆盖hashCode()
类中的Coordinate
。 hashCode()
的合同要求,如果a.equals(b)
为true,则a.hashCode() == b.hashCode()
也必须为true。
正确覆盖hashCode()
会导致A.equals(B)
返回true,因为equals
的{{1}}在以下情况下返回true:
这两个集合具有相同的大小,并且指定集合中的每个成员都包含在此集合中(或等效地,该集合中的每个成员都包含在指定集合中)。
一种可能的实现方式:
Set
答案 1 :(得分:0)
生成hashCode和equals方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Coordinate other = (Coordinate) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}