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中的给定列表进行了排序,有人可以解释这个比较器的工作原理并进行排序吗?我正在努力了解如何对列表进行排序。预先感谢
答案 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
方法,该方法的工作方式与此类似。)
但是使用自己的比较器没有任何危害,问题中的代码说明了如何实现。