Краткий ответ: a Comparator
сообщает методам сортировки и c, как сравнивать два объекта, то есть в каком порядке они должны быть. Код в вопросе на самом деле не нуждается в этом, потому что Int
s уже имеет естественный порядок , Но это совершенно хороший код, иллюстрирующий, что делать с объектами, которые этого не делают.
Это довольно хорошо объяснено в документации для Comparator
… (В общем, документы довольно хороши для всей стандартной библиотеки Java, так что это хорошее место для начала.)
Некоторые объекты имеют «естественный порядок»; например, есть очень очевидный порядок для чисел (числовой порядок) и строк (словарный порядок). В Java и Kotlin на это указывают объекты, реализующие интерфейс Comparable
. Все стандартные функции сортировки, упорядочивания и т. Д. Знают, какой порядок использовать.
Но как насчет объектов, которые не имеют естественного порядка? В этом случае, если вы хотите отсортировать их или сделать что-либо, что включает в себя порядок, вам придется объяснить, какой порядок использовать. Вы делаете это, предоставляя объект, реализующий Comparator
.
Это единственный метод int compare(T o1, T o2)
: реализация должна решить, будет ли o1
меньше, больше или равен o2
. Это делается путем возврата отрицательного числа, если o1
<<code>o2, нуля, если o1
= o2
, или положительного числа, если o1
> o2
.
Вот что делает код в вопросе.
Метод List.sortedWith()
использует компаратор для создания отсортированной версии списка. Используемый алгоритм сортировки точно определит, какие объекты он сравнивает, но, например, он может начать со сравнения первых двух элементов в списке: 7 и 3. Он вызовет компаратор с compare(7, 3)
, и компаратор вернет положительное значение. номер (в данном случае 1), чтобы указать, что 7 должно идти после 3 в списке. Затем он продолжит обрабатывать список и проводить дальнейшие сравнения, пока не получит список по порядку.
Как я уже сказал, в этом случае нет необходимости писать компаратор, потому что Int
уже имеют естественный порядок! Таким образом, вы можете просто использовать list.sorted()
. (Тогда бы использовался Int
собственный метод compareTo()
, который работает аналогичным образом.)
Но использование собственного компаратора не повредит, и код в вопросе показывает, как это можно сделать.