此代码基本上按降序对数组进行排序:
val arrayList = arrayListOf(1, 5, 2)
Collections.sort(arrayList, object : Comparator<Int> {
override fun compare(x : Int, y: Int) = y - x
})
世界如何覆盖与y - x
的比较方法有效?如果y - x
,Kotlin如何知道y
在x
之前放置y < x
意味着什么?
答案 0 :(得分:18)
这实际上与Kotlin无关。它与Java API的Comparator接口有关,也与Collections.sort如何使用它有关。
比较其订单的两个参数。返回一个负整数, 零或正整数,因为第一个参数小于,等于 到,或大于第二个。
现在让我们试试你给出的论点:
Collections.sort
对 y - x 的含义一无所知。它只是尊重Comparator接口的定义合同,任何实现者也需要尊重(如果它想要工作)。
恰好恰好y - x
是一个尊重合同的实现,因为Math。
答案 1 :(得分:3)
由于Comparator是一个SAM接口,您可以使用lambda:
更简洁地编写此代码Collections.sort(arrayList, {x : Int, y: Int -> y - x})
甚至
Collections.sort(arrayList) {
x, y -> y - x
}
因为lambda是sort
函数的最后一个参数,可以推断出x
和y
的数据类型。
获取两个对象并且必须为它们定义单个整数是排序定义的抽象。您基本上指定了这些元素在排序时将按哪种顺序排列。
对于排序整数,它可能看起来像是一种过度杀伤,但考虑必须为类Car
的实例排序更复杂的对象。
此类有colorCode
,您希望按此排序:
Collections.sort(cars) {
car1, car2 -> car1.colorCode - car2.colorCode
}
这就是如何以抽象的方式为这些对象定义订单。
答案 2 :(得分:1)
在Kotlin中,您还可以使用kotlin集合扩展函数sort,sorted,sortBy ....等对元素进行排序
val arrayList = arrayListOf(1, 5, 2).sorted() //1,2,5
或
val arrayList = arrayListOf(1, 5, 2).sortedDescending() //5,2,1