Расширение компаратора в Котлине - PullRequest
0 голосов
/ 05 июля 2019
val list = listOf(7,3,5,9,1,3)
list.sortedWith(Comparator<Int>{ a, b ->
    when {
        a > b -> 1
        a < b -> -1
        else -> 0
    }
})

Ответ - [1, 3, 3, 5, 7, 9]

Выше кода отсортируйте данный список в Kotlin. Может кто-нибудь объяснить, как работает этот компаратор, и выполнить сортировку. Я пытаюсь понять, как этот список сортируется. Заранее спасибо,

1 Ответ

0 голосов
/ 05 июля 2019

Краткий ответ: 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(), который работает аналогичным образом.)

Но использование собственного компаратора не повредит, и код в вопросе показывает, как это можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...