为什么 Kotlin 的 sortBy() 方法似乎是倒序操作?

3
"最初的回答"
当我执行以下操作时:
val array = arrayListOf<String?>(null, "hello", null)
array.sortBy { it == null }
println(array)

我预计它会首先打印null值,因为那是我指定的选择器。然而,println(array)返回[hello, null, null]

这是为什么呢?

Translated:
2个回答

8
表达式:
it == null

返回一个布尔结果,truefalse,这是你用来对数组进行排序的依据。
true 大于 false,你可以通过执行以下代码来查看:

println(false < true)

这将会打印输出

true

使用您的代码:

array.sortBy { it == null }

对于表达式 it == null 返回 false 的每个项,它都会被放置在返回 true 的任何项之前。所以相反地做:
array.sortBy { it != null }

结果:

[null, null, hello]

4

请记住,sortBy 在每个对象上执行您指定的 转换,然后按转换后对象的自然顺序进行排序。

您将对象转换为 true(如果对象为空)和 false(如果对象不为空)。这是您转换后的数组列表:

true false true

这将按布尔值的自然顺序进行排序,即false优先,因此第二个元素将与第一个元素交换,产生结果。

要获得您想要的结果,请使用{ it != null }


即使 { it != null } 会将非空值放在一起,但顺序是不确定的。(在这种情况下只有一个值,所以不明显。)我建议使用 { it ?: "" },它会对每个项进行排序,将空值(和任何空字符串)放在首位。 - gidds
从我所做的每个测试来看,非空元素的顺序与预排序列表中的顺序相同。 - forpas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接