Как работает Comparator.compare ()?

Необязательно, если вы используете Macports, вы можете использовать python_select. Установите python_select с помощью:

$ sudo port install python_select

Предполагая, что python 2.6 и 2.5 установлены в Mac OS, вы можете переключать питоны так:

$ sudo python_select python25
=> Selecting version "python25" for python
$ python --version
=> 2.5.5
$ sudo python_select python26
=> Selecting version "python26" for python
$ python --version
=> 2.6.6
2
задан Zorgan 1 March 2019 в 11:34
поделиться

3 ответа

Это сводится к этому утверждению из javadoc :

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

Это все, что нужно для этого. Когда вы пишете компаратор, вы определяете , в каком порядке вы хотите. Ключевым моментом является то, что ваш метод возвращает -1, 0 или 1. В зависимости от того, как вы хотите упорядочить эти два входящих аргумента. (и да, ему не нужно -1 или 1, только отрицательный, ноль, положительный).

Другими словами: ключевой момент заключается в том, что compare() служит в этом контракте. Он определяет порядок для двух элементов. Это все, что нужно для этого.

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

С этой точки зрения, ваш вопрос подразумевает, что вы немного продумываете всю тему. Просто поймите: вы используете компаратор, когда намереваетесь определить «пользовательский» порядок для ваших объектов / значений.

И нет смысла определять ваш «собственный» компаратор для int, Int или Integer, так как эти классы уже определяют их естественный порядок, поэтому уже существует, например, Integer.compare () . Единственный вариант использования для определения собственного компаратора для такого класса - это когда вы хотите упорядочить их по-другому. Но, скорее всего, вы все равно использовали бы существующие функции компаратора и использовали другие встроенные способы, например, чтобы изменить «естественный» порядок.

0
ответ дан GhostCat 1 March 2019 в 11:34
поделиться

A Comparator<T> - это просто способ сравнить любые 2 элемента типа T.

Что такое x и y в сравнении (x, y) при итерации по списку?

При итерации компаратор вообще не вызывается.

При передаче в метод Collections.sort() компаратор используется всякий раз, когда базовому алгоритму сортировки необходимо сравнить 2 элемента.

Я не уверен, почему вышеприведенная функция не подходит для этого.

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

0
ответ дан Joffrey 1 March 2019 в 11:34
поделиться

Comparator является интерфейсом только для классов, которые можно сравнивать. Речь идет о сравнении любых двух объектов. Ни больше ни меньше. Из документов:

@param o1 первый объект для сравнения.

@param o2 второй объект для сравнения.

@ вернуть отрицательное целое число, ноль или положительное целое число, так как первый аргумент меньше, равен или больше второго.

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

Но как это отсортировано? Все, что мы знаем о сортировке через Collections.sort(collection, comparator), это то, что сортировка стабильна. Подробнее о сортировке: https://www.geeksforgeeks.org/sorting-algorithms/

.
0
ответ дан Cililing 1 March 2019 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: