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

时间:2019-02-27 12:59:43

标签: java equals hashset

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

2 个答案:

答案 0 :(得分:1)

如果您的SetHashSet,则您忘记覆盖hashCode()类中的CoordinatehashCode()的合同要求,如果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;
}