Почему Kotlin sortBy () работает в обратном порядке? - PullRequest
1 голос
/ 02 июня 2019

Когда я выполняю:

val array = arrayListOf<String?>(null, "hello", null)
array.sortBy { it == null }
println(array)

Я ожидаю, что сначала будет напечатано null значений, так как это селектор, который я указал.Однако println(array) возвращает [hello, null, null].

Почему это так?

Ответы [ 2 ]

6 голосов
/ 02 июня 2019

Выражение:

it == null

возвращает Boolean результат true или false, и это то, что вы используете для сортировки массива.Значение true больше false, вы можете увидеть его, выполнив:

println(false < true)

, который напечатает

true

С вашим кодом:

array.sortBy { it == null }

для каждого элемента, который возвращает выражение it == null false, он будет помещен перед любым элементом, для которого он вернет true.Так что сделайте наоборот:

array.sortBy { it != null }

Результат:

[null, null, hello]
3 голосов
/ 02 июня 2019

Имейте в виду, что sortBy выполняет преобразование , которое вы указываете для каждого из объектов, а затем сортирует по естественному порядку преобразованных объектов.

Вы преобразовали свои объекты в истины (если объект нулевой) и в ложь (если объект не нулевой). Вот ваш список преобразованных массивов:

true false true

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

Для достижения желаемого результата используйте { it != null }.

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