В чем разница между Compare () и CompareTo ()? - PullRequest
102 голосов
/ 07 января 2009

В чем разница между методами Java compare() и compareTo()? Эти методы дают один и тот же ответ?

Ответы [ 16 ]

154 голосов
/ 07 января 2009

С JavaNotes :

  • a.compareTo(b)
    Сопоставимый интерфейс: Сравнивает значения и возвращает целое число, которое сообщает, сравниваются ли значения меньше, равно или больше чем.
    Если ваши объекты класса имеют естественный порядок , реализуйте интерфейс Comparable<T> и определите этот метод. Все классы Java, которые имеют естественное упорядочение, реализуют Comparable<T> - Пример: String, классы-оболочки , BigInteger

  • compare(a, b)
    Интерфейс компаратора: Сравнивает значения двух объектов. Это реализовано как часть интерфейса Comparator<T>, и типичное использование состоит в определении одного или нескольких небольших служебных классов, которые реализуют это, для передачи в методы, такие как sort(), или для использования путем сортировки структур данных, таких как TreeMap и TreeSet. Возможно, вы захотите создать объект Comparator для следующего:

    • Множественные сравнения . Предоставить несколько разных способов что-то отсортировать. Например, вы можете отсортировать класс Person по имени, идентификатору, возрасту, росту и т. Д. Для каждого из них вы должны определить компаратор для передачи в метод sort().
    • Системный класс Чтобы предоставить методы сравнения для классов, которые вы не можете контролировать. Например, вы можете определить компаратор для строк, который сравнивает их по длине.
    • Шаблон стратегии Для реализации шаблона Стратегии, который представляет собой ситуацию, в которой вы хотите представить алгоритм в виде объекта, который вы можете передать в качестве параметра, сохранить в структуре данных и т. Д.

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


Сводка от http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

Сопоставимые
Сопоставимый объект способен сравнивать себя с другим объектом.

Компаратор
Объект сравнения способен сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов.


Контексты использования:

Сопоставимый интерфейс

Метод равенства и == и != операторы проверяют на равенство / неравенство, но не предоставляют способ проверки на относительные значения .
Некоторые классы (например, String и другие классы с естественным упорядочением) реализуют интерфейс Comparable<T>, который определяет метод compareTo().
Вы захотите реализовать Comparable<T> в своем классе, если хотите использовать его с методами Collections.sort() или Arrays.sort().

Определение объекта Comparator

Вы можете создавать компараторы для сортировки любым произвольным образом для любого класса .
Например, класс String определяет компаратор CASE_INSENSITIVE_ORDER .


Разница между этими двумя подходами может быть связана с понятием:
Заказная коллекция :

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

Коллекция с естественным порядком не просто заказана, а отсортирована . Определение естественного порядка может быть сложным! (как в порядке натуральных строк ).


Еще одно отличие, отмеченное HaveAGuess в комментариях :

  • Comparable находится в реализации и не виден из интерфейса, поэтому, когда вы сортируете, вы действительно не знаете, что произойдет.
  • Comparator дает вам уверенность в том, что порядок будет четко определен.
14 голосов
/ 07 января 2009

Сходства:
Оба являются пользовательскими способами сравнения двух объектов.
Оба возвращают int, описывающее отношения между двумя объектами.

Отличия: Метод compare() - это метод, который вы обязаны реализовать, если реализуете интерфейс Comparator. Он позволяет передавать два объекта в метод и возвращает int, описывающий их взаимосвязь.

Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);

Метод compareTo() - это метод, который вы обязаны реализовать, если реализуете интерфейс Comparable. Позволяет сравнивать объект с объектами аналогичного типа.

String s = "hi";
int result = s.compareTo("bye");

Резюме:
По сути, это два разных способа сравнения вещей.

14 голосов
/ 07 января 2009

compareTo() от интерфейса Comparable.

compare() от интерфейса Comparator.

Оба метода делают одно и то же, но каждый интерфейс используется в немного различном контексте.

Интерфейс Comparable используется для наложения естественного порядка на объекты реализующего класса. Метод compareTo() называется методом естественного сравнения. Интерфейс Comparator используется для наложения полного упорядочения на объекты реализующего класса. Для получения дополнительной информации см. Ссылки, чтобы точно определить, когда использовать каждый интерфейс.

9 голосов
/ 07 января 2009

Методы не должны давать одинаковые ответы. Это зависит от того, какие объекты / классы вы им называете.

Если вы реализуете свои собственные классы, которые, как вы знаете, вы хотите сравнить на каком-то этапе, вы можете попросить их реализовать интерфейс Comparable и соответственно реализовать метод CompareTo ().

Если вы используете некоторые классы из API, которые не реализуют интерфейс Comparable, но вы все равно хотите сравнить их. То есть для сортировки. Вы можете создать свой собственный класс, который реализует интерфейс Comparator, а в методе compare () вы реализуете логику.

3 голосов
/ 20 июля 2016

Используя Comparator, мы можем получить n чисел логики сравнения, написанных для класса .

например.

Для класса автомобиля

У нас может быть класс Comparator для сравнения на основе номера модели автомобиля. Мы также можем иметь класс Comparator для сравнения в зависимости от года выпуска автомобиля.

Класс автомобиля

public class Car  {

    int modelNo;

    int modelYear;

    public int getModelNo() {
        return modelNo;
    }

    public void setModelNo(int modelNo) {
        this.modelNo = modelNo;
    }

    public int getModelYear() {
        return modelYear;
    }

    public void setModelYear(int modelYear) {
        this.modelYear = modelYear;
    }

}

Компаратор № 1 на основе модели №

public class CarModelNoCompartor implements Comparator<Car>{

    public int compare(Car o1, Car o2) {

        return o1.getModelNo() - o2.getModelNo();
    }

}

Компаратор № 2 в зависимости от года выпуска

public class CarModelYearComparator implements Comparator<Car> {

    public int compare(Car o1, Car o2) {

        return o1.getModelYear() - o2.getModelYear();
    }

}

Но это невозможно в случае сравнимого интерфейса.

В случае интерфейса Comparable мы можем иметь только одну логику в методе CompareTo () .

3 голосов
/ 04 декабря 2014
compareTo(T object)

происходит из интерфейса java.lang.Comparable, реализованного для сравнения этого объекта с другим, чтобы дать отрицательное значение int для этого объекта меньше, чем 0, для равных, или положительное значение для большего, чем другой. Это более удобный метод сравнения, но он должен быть реализован в каждом классе, который вы хотите сравнить.

compare(T obj1, T obj2)

происходит из интерфейса java.util.Comparator, реализованного в отдельном классе, который сравнивает объекты другого класса, чтобы получить отрицательное значение типа int для первого объекта, меньшего, 0 для равных, или положительное значение для большего, чем второй объект , Это необходимо, когда вы не можете сделать класс реализующим CompareTo (), потому что он не может быть изменен. Он также используется, когда вам нужны разные способы сравнения объектов, а не только один (например, по имени или возрасту).

3 голосов
/ 19 января 2010

Сопоставимый интерфейс содержит метод с именем compareTo(obj), который принимает только один аргумент и сравнивает себя с другим экземпляром или объектами того же класса.

Интерфейс Comparator содержит метод с именем compare(obj1,obj2), который принимает два аргумента и сравнивает значения двух объектов из одного или разных классов.

2 голосов
/ 07 января 2009

compareTo() вызывается для одного объекта, чтобы сравнить его с другим объектом. compare() вызывается для некоторого объекта для сравнения двух других объектов.

Разница в том, где определяется логика, которая выполняет фактическое сравнение.

1 голос
/ 07 января 2009

Основное отличие заключается в использовании интерфейсов:

Comparable (который имеет compareTo ()) требует сравнения объектов (чтобы использовать TreeMap или сортировать список) для реализации этого интерфейса. Но что, если класс не реализует Comparable, и вы не можете изменить его, потому что он является частью сторонней библиотеки? Затем вам нужно реализовать Comparator, который немного менее удобен в использовании.

1 голос
/ 07 января 2009

Отношения объекта, имеющего этот метод, и его соавторов различны.

compareTo() - это метод интерфейса Comparable , поэтому он используется для сравнения ЭТОГО экземпляра с другим.

compare() - это метод интерфейса Comparator , поэтому он используется для сравнения двух разных экземпляров другого класса друг с другом.

Если хотите, реализация Comparable означает, что экземпляры класса можно легко сравнивать.
Реализация Comparator означает, что экземпляры подходят для сравнения различных объектов (других классов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...