Kotlin对象表达式:比较器示例

时间:2015-10-30 16:49:22

标签: java comparator anonymous-class kotlin

此代码基本上按降序对数组进行排序:

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如何知道yx之前放置y < x意味着什么?

3 个答案:

答案 0 :(得分:18)

这实际上与Kotlin无关。它与Java API的Comparator接口有关,也与Collections.sort如何使用它有关。

来自the documentation:

  

比较其订单的两个参数。返回一个负整数,   零或正整数,因为第一个参数小于,等于   到,或大于第二个。

现在让我们试试你给出的论点:

  • 1 - 5 = -4(负整数),因此1小于5.
  • 5 - 2 = 3(正整数),因此5大于2.
  • 等...

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函数的最后一个参数,可以推断出xy的数据类型。

获取两个对象并且必须为它们定义单个整数是排序定义的抽象。您基本上指定了这些元素在排序时将按哪种顺序排列。

对于排序整数,它可能看起来像是一种过度杀伤,但考虑必须为类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