Comparator.compare()如何工作?

问题描述 投票:2回答:4

学习Kotlin,我试图了解Java的Comparator界面是如何工作的 - 主要是compare()函数,所以我可以利用它。

我曾尝试阅读compare()的文档,但我想更简单地解释它是如何工作的。

什么是xycompare(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

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

java kotlin
4个回答
5
投票

它归结为来自javadoc的声明:

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

这就是全部。编写比较器时,可以定义所需的顺序。关键是你的方法返回-1,0或1.取决于你希望如何排序这两个传入的参数。 (是的,它不需要-1或1,只需负,零,正)。

换句话说:关键是compare()服务于该合同。它定义了两个元素的顺序。这就是全部。

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

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

在定义int,Int或Integer的“自己的”比较器时没有任何意义,因为这些类已经定义了它们的自然顺序,所以已经有Integer.compare()例如。为这样的类定义自己的比较器的唯一用例是当您想要以不同方式对它们进行排序时。但最有可能的是,您仍然会使用现有的比较器功能,并使用其他内置方式,例如反转“自然”顺序。


3
投票

Comparator<T>只是一种比较任何类型T的2个元素的方法。

迭代列表时,比较(x,y)中的x和y究竟是什么?

迭代时,根本不调用比较器。

当传递给Collections.sort()方法时,只要基础排序算法需要比较2个元素,就可以使用比较器。

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

您当前的实现不满足documentationcompare()需要返回一个负整数,0或一个正整数,具体取决于2个元素如何相互关联。


2
投票

compare文档很清楚:

返回负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

所以你必须从你的函数返回一个Int而不是一个布尔值。

为了提供有效的Kotlin代码,我提供了一个例子:

val list = listOf(1, 5, 2)
list.sortedWith(Comparator { x, y ->
       x.compareTo(y)
})

排序本身可以使用不同的算法执行,但它们将在内部使用compareToCollections文档给出了一个想法:

此类中包含的多态算法的文档通常包括实现的简要描述。这些描述应被视为实施说明,而不是规范的一部分。只要遵守规范本身,实现者就可以随意替换其他算法。 (例如,sort使用的算法不必是mergesort,但它必须是稳定的。)


1
投票

Comparator只是可以比较的类的接口。这是关于比较任何两个对象。没有更多,没有更少。来自docs:

@param o1要比较的第一个对象。

@param o2要比较的第二个对象。

@return一个负整数,零或一个正整数,因为第一个参数小于,等于或大于第二个参数。

排序完全是另一回事。它使用比较器(在不知道如何比较两个元素的情况下很难对任何东西进行排序),因此您可以提供自己的方式来对集合进行排序。

但它是如何排序的?我们所知道的关于通过Collections.sort(collection, comparator)排序的是排序是稳定的。查看有关排序的更多信息:https://www.geeksforgeeks.org/sorting-algorithms/

© www.soinside.com 2019 - 2024. All rights reserved.