Сравните два объекта с операторами "<" или ">" в ​​Java

Как сделать два объекта в Java сопоставимыми с помощью "<" или " > " например

MyObject<String> obj1= new MyObject<String>("blablabla", 25);
MyObject<String> obj2= new MyObject<String>("nannaanana", 17);
if (obj1 > obj2) 
    do something. 

Я сделал заголовок класса MyObject как

public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>> и создал метод Comp, но все, что я получил, теперь я могу использовать "сортировку" в списке объектов, но как я могу сравнить два объекта друг с другом напрямую? Является

if(obj1.compareTo(obj2) > 0)
     do something

единственный способ?

Ответ 1

Вы не можете выполнять перегрузку оператора в Java. Это означает, что вы не можете определить пользовательские поведения для таких операторов, как +, >, <, == и т.д. В ваших собственных классах.

Как вы уже отметили, реализация Comparable и использование метода compareTo(), вероятно, будет в этом случае.

Другой вариант - создать Comparator (см. docs), особенно если это не имеет смысла для класс для реализации Comparable или если вам нужно сравнивать объекты из одного и того же класса по-разному.

Чтобы улучшить читаемость кода, вы можете использовать compareTo() вместе с пользовательскими методами, которые могут выглядеть более естественными. Например:

boolean isGreaterThan(MyObject<T> that) {
    return this.compareTo(that) > 0;
}

boolean isLessThan(MyObject<T> that) {
    return this.compareTo(that) < 0;
}

Затем вы можете использовать их следующим образом:

if (obj1.isGreaterThan(obj2)) {
    // do something
}

Ответ 2

Использование Comparable.compareTo(T) является единственным вариантом (или Comparator). Интерфейс определяет только один метод (while Comparator добавляет equals), и он сравнивает этот объект с указанным объектом для заказа. Кроме того, Java не разрешает перегрузку оператора (так что вы не сможете напрямую изменять операнд, используемый для вызова этого метода, или на самом деле изменить интерфейс).

Ответ 3

Это не единственный способ. Вы также можете реализовать Компаратор. Компаратор использует метод compare() как противоположенный Comparable, который использует метод compareTo().

Причина, по которой вы не можете использовать > или < для прямого сравнения объектов, заключается в том, что Java не будет знать, какую переменную вы хотите использовать для сравнения (поскольку в объекте может быть больше одной переменной).

Чтобы сравнить объекты, эти объекты должны быть сопоставимы. Вам нужно определить и сказать Java, как вы хотите их сравнить.

Java-коллекция предоставляет метод sort. Однако какая-то школа дает задание просить вас написать свои собственные методы сортировки, которые в конечном итоге все еще используют compareTo() для сравнения.

Вы можете взглянуть на тонкие различия между Comparable vs Comparator здесь: В чем разница между compare() и compareTo()?


Думаю, стоит также отметить, что по умолчанию Java сравнивает String (объекты) в лексикографическом порядке, если вы не переопределили метод compareTo().