Да ладно, эта статья полностью разбирается в Comparable и Comparator в Java.

Java

Привет всем, я Silent King Er. Когда я сегодня просматривал programcreek, я нашел несколько тем, которые сосредоточены на деталях, но бесценны. Например: Являются ли Java Comparable и Comparator братьями? Подобные душераздирающие темы заслуживают более пристального внимания.

Comparable и Comparator — это два интерфейса в Java, и мы можем прочитать их сходство из названия: чтобы каким-то образом сравнить два объекта. Но в чем именно разница между ними? Пожалуйста, пойдем со мной, сразись с монстрами, чтобы продвинуться вперед!

01. Сопоставимо

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

public interface Comparable<T> {
    int compareTo(T t);
}

Если класс реализует интерфейс Comparable (просто сделайте одну вещь, переопределитеcompareTo()метод), вы можете сравнивать созданные им объекты по своим правилам. Пример приведен ниже.

public class Cmower implements Comparable<Cmower> {
    private int age;
    private String name;

    public Cmower(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(Cmower o) {
        return this.getAge() - o.getAge();
    }

    public static void main(String[] args) {
        Cmower wanger = new Cmower(19,"沉默王二");
        Cmower wangsan = new Cmower(16,"沉默王三");

        if (wanger.compareTo(wangsan) < 0) {
            System.out.println(wanger.getName() + "比较年轻有为");
        } else {
            System.out.println(wangsan.getName() + "比较年轻有为");
        }
    }
}

В приведенном выше примере я создал класс Cmower, в котором есть два поля: возраст и имя. Класс Cmower реализует интерфейс Comparable и переписываетcompareTo()метод.

Результат вывода программы: «Молчаливый Ван Сан моложе и перспективнее», потому что он на три года моложе Молчаливого Ван Эра. Есть ли доказательства этого результата?

ДоказательствоcompareTo()метод, возвращаемое значение этого метода может быть отрицательным, нулевым или положительным, что означает, что объект меньше, равен или больше сравниваемого объекта в соответствии с правилами сортировки. Возникает, если тип указанного объекта не сопоставим с этим объектомClassCastExceptionИсключение (это редко случалось со времен дженериков).

02. Компаратор

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

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

первый методcompare(T o1, T o2)Возвращаемое значение может быть отрицательным, нулевым или положительным, что означает, что первый объект меньше, равен или больше второго объекта.

второй способequals(Object obj)Вам нужно передать объект в качестве параметра и определить, совместим ли объект с компаратором.

Иногда мы хотим оставить класс как есть и не хотим активно реализовывать интерфейс Comparable, но нам нужно их сравнить, что нам делать?

Вот где Comparator пригодится, давайте рассмотрим пример.

1) Класс Cmower как он есть.

public class Cmower  {
    private int age;
    private String name;

    public Cmower(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

(Говорят, что он цел, геттер/сеттер съеден)

Класс Cmower имеет два поля: возраст и имя, что означает, что класс можно сортировать по возрасту или имени.

2) Давайте посмотрим на класс реализации интерфейса Comparator.

public class CmowerComparator implements Comparator<Cmower> {
    @Override
    public int compare(Cmower o1, Cmower o2) {
        return o1.getAge() - o2.getAge();
    }
}

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

public class CmowerNameComparator implements Comparator<Cmower> {
    @Override
    public int compare(Cmower o1, Cmower o2) {
        if (o1.getName().hashCode() < o2.getName().hashCode()) {
            return -1;
        } else if (o1.getName().hashCode() == o2.getName().hashCode()) {
            return 0;
        }
        return 1;
    }
}

3) Давайте снова посмотрим на тестовый класс.

Cmower wanger = new Cmower(19,"沉默王二");
Cmower wangsan = new Cmower(16,"沉默王三");
Cmower wangyi = new Cmower(28,"沉默王一");

List<Cmower> list = new ArrayList<>();
list.add(wanger);
list.add(wangsan);
list.add(wangyi);

list.sort(new CmowerComparator());

for (Cmower c : list) {
    System.out.println(c.getName());
}

Создал три объекта разного возраста и с разными именами и добавил их в Список. Затем используйте Списокsort()метод для сортировки и просмотра результатов вывода.

沉默王三
沉默王二
沉默王一

Это означает, что Молчаливый Ван Сан моложе Молчаливого Ван Эра и занимает первое место, Молчаливый Ван И старше, чем Молчаливый Ван Эр и занимает третье место. Точно в соответствии с нашими ожиданиями.

03. Какой из них я должен использовать?

Разницу между Comparable и Comparator можно сравнить с помощью двух приведенных выше примеров:

  • Класс реализует интерфейс Comparable, что означает, что объекты этого класса можно сравнивать (сортировать) напрямую, но есть только один способ сравнения (сортировки), причем очень единственный.
  • Если класс хочет остаться таким, какой он есть, но его нужно сравнивать (сортировать) по-другому, он может настроить компаратор (реализовать интерфейс Comparator).
  • Сопоставимый интерфейс вjava.langпакет, покаComparatorинтерфейс вjava.utilБао Ся не настоящий брат, но его можно назвать двоюродным братом (двоюродным братом).

Возьмем неуместный пример. Я хочу отправиться из Лояна в Пекин, чтобы увидеть Великую китайскую стену и почувствовать себя героем, будь то на самолете или на скоростном поезде, но если это будет Король обезьян, это будет сальто. В чем разница между мной и Сунь Укуном? Сунь Укун сам реализовал интерфейс Comparable (в его время не было ни самолета, ни высокоскоростной железной дороги, поэтому у него не было выбора), а я могу использовать интерфейс Comparator (современный транспорт).

Таким образом, если сортировка объектов должна основываться на естественном порядке, выберитеComparable, если вам нужно отсортировать по разным свойствам объекта, выберитеComparator.

04. Спасибо

Ну что же, читатели и друзья, вышеизложенное и есть все содержание этой статьи.Все, что вы можете здесь увидеть, это самые толстые программисты (нет, лучшие), вы тот, кто получает повышение и прибавку к зарплате.👍. Если вы не думаете, что это весело, и хотите увидеть больше, вы можете отметить GitHub второго брата【itwanger.github.io], эта статья была включена.

Оригинальность непроста, если сочтете это полезным, пожалуйста, не скупитесь на право лайка в ваших руках- Это будет моя самая сильная мотивация письма.