比较器在Kotlin的解释

时间:2019-07-05 03:48:32

标签: sorting pointers kotlin data-structures collections

val list = listOf(7,3,5,9,1,3)
list.sortedWith(Comparator<Int>{ a, b ->
    when {
        a > b -> 1
        a < b -> -1
        else -> 0
    }
})

答案-[1、3、3、5、7、9]

  

上面的代码对Kotlin中的给定列表进行了排序,有人可以解释这个比较器的工作原理并进行排序吗?我正在努力了解如何对列表进行排序。预先感谢

1 个答案:

答案 0 :(得分:0)

简短的答案:Comparator告诉排序&c方法如何比较两个对象,即它们应该处于什么顺序。问题中的代码实际上不需要一个,因为Int已经存在有一个自然的顺序。但这是完美的代码,并说明了如何处理不适用的对象。

Comparator的文档中对此进行了很好的解释……(通常,这些文档对于所有Java标准库都非常有用,因此这是一个不错的起点。)

某些对象具有“自然顺序”;例如,数字(数字顺序)和字符串(字典顺序)的排序非常明显。在Java和Kotlin中,这由实现Comparable接口的对象指示。所有标准的排序,排序和&c函数都知道使用哪种顺序。

但是没有自然顺序的对象呢?在这种情况下,如果您想对它们进行排序或进行涉及订购的任何事情,则必须说明要使用的订购顺序。为此,您需要提供一个实现Comparator的对象。

这只有一个方法int compare(T o1, T o2):实现必须决定o1小于,大于还是等于o2。如果o1 <o2,则返回负数;如果o1 = o2,则返回零;如果o1> {{1},则返回正数}。

这就是问题代码的作用。

o2方法使用比较器创建列表的排序版本。它使用的排序算法将确定要比较的对象,但是例如可以从比较列表中的前两个项目开始:7和3.它将使用List.sortedWith()调用比较器,比较器将返回一个正数(在本例中为1),表示列表中的3应该排在7之后。然后它将继续处理列表并进行进一步的比较,直到可以按顺序生成列表为止。

正如我所说,在这种情况下,无需编写比较器,因为compare(7, 3)已具有自然顺序!因此,您只需使用Int。 (然后将使用list.sorted()自己的Int方法,该方法的工作方式与此类似。)

但是使用自己的比较器没有任何危害,问题中的代码说明了如何实现。