我创建了一个名为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()来评估集合是否相等?
如果你的Set
s是HashSet
s,你忘了在hashCode()
类中覆盖Coordinate
。 hashCode()
的合同要求如果a.equals(b)
为真,a.hashCode() == b.hashCode()
也必须是真的。
正确覆盖hashCode()
将导致A.equals(B)
返回true,因为equals
为Set
返回true,如果:
这两个集合具有相同的大小,并且指定集合的每个成员都包含在此集合中(或者等效地,此集合的每个成员都包含在指定集合中)。
一种可能的实现:
@Override
public int hashCode()
{
return Objects.hash(x,y);
}
生成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;
}