BitNeBolt
@BitNeBolt

Как правильно реализовать Comparable в данном случае?

У меня есть структура Vector3, обладающая тремя координатами по каждой их осей. Для алгоритма мне нужно проверять, содержится ли элемент в множестве.

Как сделать, чтобы множество сверяло элементы по моему правилу, а не по своему?

Я пытался реализовать Comparable, но нужного результата не получил:
Реализация

@Override
    public int compareTo(Object o)
    {
        Vector3 vector3 = (Vector3) o;

        if (x == vector3.getX() && y == vector3.getY() && z == vector3.getZ())
            return 0;
        
        else return -1;
    }

  • Вопрос задан
  • 61 просмотр
Решения вопроса 2
BorLaze
@BorLaze
Java developer
В множестве - это в Set? Тогда надо переопределять equals и hashCode.
Comparable нужен для сортировки.

ЗЫ: compareTo, кстати, тоже неправильно написан. Данная реализация возвращает либо "равно" (0), либо "меньше" (-1). А должна возвращать -1 / 0 / 1
Ответ написан
@YuryBorodkin
Android dev
Как вам указали выше - нужна переопределить equals и hashcode, т.к именно с помощью этих методов множества проверяют элемент на вхождение в джава. Например -
public class Vector3 {
    private final int x;
    private final int y;
    private final int z;

    public Vector3(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getZ() {
        return z;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Vector3 vector3 = (Vector3) o;
        return x == vector3.getX() &&
                y == vector3.getY() &&
                z == vector3.getZ();
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y, z);
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы