#java #comparator
#java #компаратор
Вопрос:
class Checker implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
if (p1.score == p2.score) {
return p1.name.compareTo(p2.name);
} else {
return p2.score - p1.score;
}
}
}
как p2.score — p1.score позволяет ему опускаться
в то время как p1.score — p2.score делает, это возрастает
как положительное или отрицательное целое число или нулевой возврат сортирует объекты? что происходит внутри
пожалуйста, помогите, спасибо
Комментарии:
1.Мне нравится думать об этом так:
a<b
также может быть записан какa-b<0
. Другими словами, когдаa<b
compare(a,b)
должно быть возвращено значение, которое<0
. Когдаa==b
тогдаcompare(a,b)
должен вернуться0
. Когдаa>b
compare(a,b)
должно быть возвращено значение>0
. Основываясь на этом, алгоритмы сортировки (которые по умолчанию пытаются упорядочить «от наименьшего к наибольшему») принимают решение, следует ли в настоящее время сравнивать пару элементовa
иb
, поменять их местами или нет.2. docs.oracle.com/javase/8/docs/api/java/util/Comparator.html Для математически склонных отношение, которое определяет наложенный порядок, который данный компаратор c налагает на данный набор объектов S, является: {(x, y) таким, что c.compare(x, y) <= 0}. Коэффициент для этого общего порядка равен: {(x, y) такой, что c.compare(x, y) == 0}.
Ответ №1:
Функция сравнения, которая налагает полный порядок на некоторую коллекцию объектов. …
И из Comparator:compare
документации:
…
ВОЗВРАТ:
отрицательное целое число, ноль или положительное целое число в качестве первого аргумента меньше, равно или больше второго.
Таким образом, Comparator
определяет только порядок. Алгоритм сортировки должен использовать эту информацию и фактически сортировать структуру данных. Если мы посмотрим, как, например, работают быстрая сортировка и сортировка слиянием, мы увидим, что этим алгоритмам нужно только знать, является ли какой-либо элемент a
меньшим, равным или большим, чем b
, что является информацией, которую Comparator
предоставляет a < 0
(возвращая значение = 0
, > 0
или,,,,).
Теперь давайте объясним, как a - b
он выполняет сортировку в порядке возрастания (давайте дадим этому Comparator
имя asc
), в то время как b - a
он выполняет сортировку в порядке убывания ((давайте дадим этому Comparator
имя desc
): мы должны рассмотреть три разных случая для двух Comparator
s.
Во-первых, предположим, что a > b
. Затем
a - b > 0
, таким образом,a
«больше», чемb
согласноasc
b - a < 0
, таким образом,a
«меньше», чемb
согласноdesc
Далее предположим, что a < b
. Затем
a - b < 0
таким образом,a
«меньше», чемb
согласноasc
b - a > 0
, таким образом,a
«больше», чемb
согласноdesc
Наконец, предположим, что a == b
. Тогда a - b == b - a == 0
и элементы «равны» в соответствии с обоими Comparator
значениями.
Комментарии:
1. как я узнаю, меньше или больше a, чем b. сравнивается ли первый объект в моем массиве первым со вторым?
2. Как я уже сказал: пожалуйста, посмотрите на некоторые известные алгоритмы сортировки, такие как быстрая сортировка и сортировка слиянием. Везде, где эти алгоритмы используют
<
,==
или>
, вызываетсяComparator::compare
-метод и вычисляется его возвращаемое значение (< 0
для<
,== 0
для==
и> 0
для>
).