Как сравнить 2 объекта

104
13 апреля 2021, 14:10

Как без лапша-кода сравнить 2 объекта?

Например такой класс

public class MyObject{
    String name;
    String surname;
    int age;
    boolean isAlive;
}

и чтобы не писать что-то типа

boolean isEquals(Myobject o1, Myobject o2) {
    if (!o1.name.equals(o2.name)) {
        return false;
    }
    if (!o1.surname.equals(o2.surname)) {
        return false;
    }
    if (o1.age != (o2.age)) {
        return false;
    }
    return o1.isAlive == o2.isAlive;
}
Answer 1

Вам нужно переопределить метод Object::equals().

Вы можете автоматически сделать это через IntelliJ IDEA:
Code -> Generate -> equals and hashcode.

У вас должно получиться что-то похожее на это:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyObject myObject = (MyObject) o;
    return Objects.equals(name, myObject.name) &&
            Objects.equals(surname, myObject.surname) &&
            age == myObject.age
            isAlive == myObject.isAlive;
}

Можно будет сравнивать так:

myObject1.equals(myObject2);

Answer 2
Comparator<MyObject> comparator = Comparator.comparing(MyObject::getName)
                                            .thenComparing(MyObject::getSurname)
                                            .thenComparing(MyObject::isAlive)
                                            .thenComparingInt(MyObject::getAge);
Comparator<MyObject> nullSafe = Comparator.nullsFirst(comparator);
return nullSafe.compare(o1, o2) == 0;
Answer 3

Если хочется универсальный метод, то можно как-то так, рефлекшеном, но Вы наверняка сами знаете, что это медленно и все такое:

private static boolean eq(Object o1, Object o2) {
    try {
        if (o1 == null && o2 == null) return true;
        if (o1 == null || o2 == null) return false;
        if (!o1.getClass().equals(o2.getClass())) return false;
        for (Field field : o1.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            Object v1 = field.get(o1);
            Object v2 = field.get(o2);
            if (v1 == null && v2 == null) continue;
            if (v1 == null || v2 == null) return false;
            if (!v1.equals(v2)) return false;
        }
    } catch (IllegalAccessException e) {
        return false;
    }
    return true;
}

PS: В целом не рекомендую использовать такой подход, уж лучше сгенерировать метод через ide

Answer 4

Если вам нужно сравнивать объекты, в них нужно переопределять метод equals().

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof MyObject)) return false;
    MyObject that = (MyObject) o;
    return isAlive == that.isAlive &&
            age == that.age &&
            name.equals(that.name) &&
            surname.equals(that.surname);
}
Answer 5

С помощью библиотеки Apache Commons Lang и рефлексии можно даже в одну строчку

return new EqualsBuilder().reflectionEquals(o1, o2);
READ ALSO
Маска номера +7 в джаваскрипт

Маска номера +7 в джаваскрипт

Есть поле ввода номера телефона

82
Помощь в сортировке, с использованием JS [закрыт]

Помощь в сортировке, с использованием JS [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

84
Удаление div со смещением

Удаление div со смещением

Есть блокcontainer в который динамически с помощью jquery добавляются div блоки нумерованные от 0 до 9

97