Как сравнивать и сравнивать работу?
Я знаю, что 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
Ответы
Ответ 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 для строк, которые сравнивали их по длине.
- Шаблон стратегии Чтобы реализовать шаблон стратегии, в котором вы хотите представить алгоритм как объект, который вы можете передать как параметр, сохранить в структуре данных и т.д.