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

2022-09-02 21:06:12

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

val arrayList = arrayListOf(1, 5, 2)

Collections.sort(arrayList, object : Comparator<Int> {
   override fun compare(x : Int, y: Int) = y - x
})

如何用作品覆盖比较方法?Kotlin 如何知道在 if 之前放置什么意思?y - xy - xyxy < x


答案 1

这实际上与Kotlin无关。它与Java API的比较器接口以及Collections.sort如何使用它有关。

文档中:

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

现在,让我们为您给出的参数尝试一下:

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

Collections.sorty - x 的含义一无所知。它只是尊重比较器接口的定义契约,任何实现者也需要尊重(如果它想工作的话)。

碰巧的是,这是一个尊重该契约的实现,因为数学。y - x


答案 2

由于 Comparator 是一个 SAM 接口,因此您可以使用 lambda 更简洁地编写此代码:

Collections.sort(arrayList, {x : Int, y: Int -> y - x})

甚至

Collections.sort(arrayList) {
    x, y -> y - x
}

因为 lambda 是函数的最后一个参数,数据类型和 可以推断出来。sortxy


获取两个对象并为其定义单个整数是排序定义的抽象。您基本上指定了这些元素在排序时的布局顺序。

对于整数进行排序,这似乎有些过分,但请考虑必须对更复杂的对象进行排序,例如类的实例。Car

这个类有一个,你想按它排序:colorCode

Collections.sort(cars) {
    car1, car2 -> car1.colorCode - car2.colorCode
}

这就是您如何以抽象的方式为这些对象定义顺序。


推荐