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

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

Ответы [ 16 ]

0 голосов
/ 10 апреля 2019

Использовать сопоставимый интерфейс для сортировки по нескольким значениям, таким как age, name, dept_name ... Для одного значения используйте интерфейс Comparator

0 голосов
/ 10 августа 2018

Есть технический аспект, который также следует подчеркнуть. Скажем, вам нужна параметризация поведения сравнения из клиентского класса, и вы задаетесь вопросом, использовать ли Comparable или Comparator для такого метода:

class Pokemon {
    int healthPoints;
    int attackDamage;
    public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
        if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
            System.out.println("battle won");
        } else {
            System.out.println("battle lost");
        }
    }
}

comparable будет лямбда или объект, и у comparable нет возможности получить доступ к полям this Pokemon. (В лямбде this относится к экземпляру внешнего класса в области видимости лямбды, как определено в тексте программы.) Так что это не вылетает , и мы должны использовать Comparator два аргумента.

0 голосов
/ 27 мая 2018

Еще одна точка:

  • compareTo() от интерфейса Comparable и compare() от интерфейса Comparator.
  • Comparable используется для определения порядка по умолчанию для объектов в классе, а Comparator используется для определения пользовательского порядка, передаваемого методу.
0 голосов
/ 19 декабря 2017

Таблица сотрудников
Имя, DoB, Зарплата
Томас, 10.02.1982, 300
Даниил, 3/11/1990, 400
Кваме, 10.10.1998, 520

Интерфейс Comparable позволяет сортировать список объектов, например, Сотрудники со ссылкой на одно основное поле - для Например, вы можете сортировать по имени или по зарплате с помощью CompareTo () метода

emp1.getName().compareTo(emp2.getName())

Более гибкий интерфейс для таких требований обеспечивается интерфейс Comparator , единственным методом которого является compare ()

public interface Comparator<Employee> {
 int compare(Employee obj1, Employee obj2);
}

Пример кода

public class NameComparator implements Comparator<Employee> {

public int compare(Employee e1, Employee e2) {
     // some conditions here
        return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an 
    return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}

}

0 голосов
/ 11 марта 2013
Important Answar
String name;
int roll;

public int compare(Object obj1,Object obj2) { // For Comparator interface
    return obj1.compareTo(obj1);
}

public int compareTo(Object obj1) { // For Comparable Interface
    return obj1.compareTo(obj);
}

Здесь в return obj1.compareTo(obj1) или return obj1.compareTo(obj) заявлении только взять объект; Примитив не допускается. Например

name.compareTo(obj1.getName()) // Correct Statement.

Но

roll.compareTo(obj1.getRoll()) 
// Wrong Statement Compile Time Error Because roll 
// is not an Object Type, it is primitive type.

name - String Object, чтобы он работал. Если вы хотите отсортировать число учеников, используйте код ниже.

public int compareTo(Object obj1) { // For Comparable Interface
    Student s = (Student) obj1;
    return rollno - s.getRollno();
}  

или

public int compare(Object obj1,Object obj2) { // For Comparator interface
    Student s1 = (Student) obj1;
    Student s2 = (Student) obj2;
    return s1.getRollno() - s2.getRollno();
}  
0 голосов
/ 07 января 2009

Когда вы хотите отсортировать список, включающий объект Foo, класс Foo должен реализовать интерфейс Comparable, поскольку метод сортировки списка использует этот метод.

Если вы хотите написать класс Util, который сравнивает два других класса, вы можете реализовать класс Comparator.

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