Java比较两个集合填充满足equals()的同一对象的不同实例

问题描述 投票:1回答:2

我创建了一个名为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()来评估集合是否相等?

java equals hashset
2个回答
1
投票

如果你的Sets是HashSets,你忘了在hashCode()类中覆盖CoordinatehashCode()的合同要求如果a.equals(b)为真,a.hashCode() == b.hashCode()也必须是真的。

正确覆盖hashCode()将导致A.equals(B)返回true,因为equalsSet返回true,如果:

这两个集合具有相同的大小,并且指定集合的​​每个成员都包含在此集合中(或者等效地,此集合的每个成员都包含在指定集合中)。

一种可能的实现:

@Override
public int hashCode()
{
    return Objects.hash(x,y);
}

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.