Подтвердить что ты не робот

Как сравнивать и сравнивать работу?

Я знаю, что compare и compareTo возвращает значение int.

Например:

Returns
0 if a equal b
-1 if a < b
+1 if a > b

sort метод вызывает вызов методов compareTo или compare(). Но как метод sort упорядочивает list, когда compare или compareTo возвращает значение int. Что такое фоновый сценарий, выполняемый после compare или compareTo, возвращает значение int для сортировки? Как метод sort использует значения int (-1 или 0 или 1), возвращенные ему из compare и compareTo

4b9b3361

Ответ 1

Если два сравниваемых элемента (a, b) уже находятся в правильном порядке, compare(a, b) и a.compareTo(b) возвращают значение <= 0, поэтому ничего не должно происходить.

Если они не в правильном порядке, возвращаемое значение равно > 0, что означает, что они должны быть взаимозаменяемы.

Ответ 2

Алгоритмы сортировки общего случая основаны на сравнении. Если вы сравниваете между a и b - существует ровно 3 возможности: a == b, a > b, a < b.

Метод compare() или compareTo() предоставляет именно эту информацию.

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

Java выбрала алгоритм TimSort для его реализации сортировки.

В качестве упражнения вы можете создать собственный алгоритм сортировки 1. Вы можете найти максимальный элемент массива с помощью метода compare()? когда вы его нашли, где это должно быть? что вы должны делать дальше?


(1) Ну, подумайте об этом сами, но он уже существует, на самом деле:)

Ответ 3

Прочитайте этот документ:

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

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

    • Несколько сравнений. Предоставить несколько разных способов сортировки. Например, вы можете отсортировать класс Person по имени, ID, возрасту, высоте,... Вы бы определили Comparator для каждого из них, чтобы перейти к методу sort().
    • Класс системы. Предоставлять методы сравнения для классов, которые вы не контролируете. Например, вы можете определить Comparator для строк, которые сравнивали их по длине.
    • Шаблон стратегии Чтобы реализовать шаблон стратегии, в котором вы хотите представить алгоритм как объект, который вы можете передать как параметр, сохранить в структуре данных и т.д.