学习Kotlin的过程中,我试图了解Java的Comparator接口(interface)的工作方式-主要是compare()函数,以便我可以利用它。

我已经尝试阅读compare()的文档,但是我想对它的工作原理进行更简单的说明。

遍历列表时x中的ycompare(x, y)到底是什么?迭代时,它是否定位并比较每对数字?例如:

arrayOf(1, 2, 3, 4)

它会比较1和2(x和y),然后比较2和3(x和y),然后比较3和4(x和y)吗?

我有一个Kotlin函数,它提供了一个比较器来对列表进行降序排序:
import java.util.*

fun getList(): List<Int> {
    val arrayList = arrayListOf(1, 5, 2)
    Collections.sort(arrayList, object: Comparator<Int> {
        override fun compare(x: Int, y: Int){
            return x < y
        }
    } )
    return arrayList

我不确定为什么上面的函数不是完成该任务的正确语法。

最佳答案

它来自javadoc的以下语句:



这就是全部。编写比较器时,您定义您想要的顺序。关键是您的方法将返回-1、0或1。这取决于您希望将这两个传入参数排序的方式。 (是的,它不必为-1或1,只需为负,零,正)。

换句话说:关键是compare()在该契约(Contract)中起作用。它在两个元素上定义了顺序。这就是全部。

在对数据进行排序时,每次在基础排序代码需要知道两个元素的顺序时都会调用它。因此,这些调用发生的确切“顺序”以及传递的参数取决于实际的排序算法以及要排序的数据。

从这个 Angular 来看,您的问题意味着您对整个主题有一些过度思考。简单理解:打算为对象/值定义“自定义”顺序时使用比较器。

并且没有必要为int,Int或Integer定义“自己的”比较器,因为这些类已经定义了它们的自然顺序,因此例如已经存在Integer.compare()。为此类定义自己的比较器的唯一用例是当您要对它们进行不同排序时。但是最有可能的是,您仍将使用现有的比较器功能,并使用其他内置方式,例如颠倒“自然”顺序。

关于java - Comparator.compare()如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54943819/

10-12 02:44