Java сравнивает два набора, заполненные разными экземплярами одного и того же объекта, которые удовлетворяют equals () - PullRequest
0 голосов
/ 27 февраля 2019

Я создал класс с именем 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.Я хотел бы проверить, содержат ли мои два набора экземпляры Coordinate, которые удовлетворят .equals ().Например:

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 голосов
/ 27 февраля 2019

Генерирует hashCode и равно методам

@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;
}
0 голосов
/ 27 февраля 2019

Если ваши Set s HashSet s, вы забыли переопределить hashCode() в классе Coordinate.Контракт hashCode() требует, чтобы, если a.equals(b) было истиной, a.hashCode() == b.hashCode() также должно было быть истиной.

Переопределение hashCode() правильно привело бы к A.equals(B) возвращению истины, поскольку equals для Set s возвращает true, если:

два набора имеют одинаковый размер, и каждый член указанного набора содержится в этом наборе (или, что то же самое, каждый член этого набора содержится в указанном наборе).

Одна из возможных реализаций:

@Override
public int hashCode()
{
    return Objects.hash(x,y);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...