KotlinSorting.gif
1.概述
Kotlin使用扩展方法构建在Java Collection框架之上。这大大提高了可用性和可读性,而无需第三方依赖,如Apache Commons或Guava。
在本教程中,我们将重点关注Kotlin中的排序。此外,我们将使用kotlin.comparisons包来实现复杂的排序规则。
2.对集合进行排序
Kotlin提供了多个实用程序,使分类集合的过程更容易。让我们探讨其中几种方法。
2.1。分类
对集合进行排序的最简单方法是调用sort方法。**此方法将使用元素的自然顺序。此外,默认情况下它会按升序排序,因此'a'在'b'之前,'1'在'2'之前:
fun main(args: Array<String>) { val intArray = mutableListOf(1,2,6,3,7,9,4) intArray.sort() println(intArray) // [1, 2, 3, 4, 6, 7, 9]}
以上代码的结果是:
[1, 2, 3, 4, 6, 7, 9]
重要的是要注意我们使用了一个可变的集合。其原因是,在那种方法就地进行排序。如果我们希望将结果作为新列表返回,那么我们只需要使用sorted方法。
此外,我们可以使用sortDescending或reverse方法按降序排序。
2.2。排序方式
如果我们需要按给定对象的特定属性进行排序,我们可以使用sortBy。 该sortBy方法允许我们通过一个选择器功能作为参数。选择器函数将接收对象,并应返回我们要排序的值:
fun main(args: Array<String>) { val mapList = mutableListOf(1 to "A" , 2 to "B", 5 to "C", 3 to "D") mapList.sortBy { it.first } println(mapList) // [(1, A), (2, B), (3, D), (5, C)] mapList.sortBy { it.second } println(mapList) // [(1, A), (2, B), (5, C), (3, D)]}
以上代码的结果是:
[(1, A), (2, B), (3, D), (5, C)] [(1, A), (2, B), (5, C), (3, D)]
同样,集合需要是可变的,因为sortBy方法将就地排序。如果我们希望将结果作为新列表返回,那么我们需要使用sortedBy方法而不是sortBy方法。
像以前一样,对于降序,我们可以使用sortByDescending或reverse方法。
2.3。SortWith
对于更高级的用法(例如,组合多个规则),我们可以使用sortWith方法。**
我们可以传递一个 Comparator对象作为参数。在Kotlin中,我们有多种方法来创建Comparator对象,我们将在下一节中介绍它:
val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortWith(compareBy({it.second}, {it.first})) println(sortedValues) // [(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]
上面代码的结果是它们按字母排序,然后按数字排序:
[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]
因为sortWith将就地进行排序,所以我们需要使用可变集合。如果我们想要将结果作为新集合返回,那么我们需要使用sortedWith方法而不是sortWith方法。
对于降序,我们可以使用反向方法或者定义正确的 比较器。
3.比较
Kotlin包含一个非常有用的包来构建 Comparator - *kotlin.comparisons。 *在以下部分中,我们将讨论:
比较器创建
处理空值
扭转订单
比较器规则扩展
为了简化Comparator的创建 *, * Kotlin带来了许多工厂方法,使我们的代码更具表现力。
最简单的 Comparator工厂是naturalOrder()。不需要参数,默认情况下顺序是升序:
val ascComparator = naturalOrder<Long>()
对于具有多个属性的对象,我们可以使用compareBy方法。作为参数,我们给出了可变数量的函数(排序规则),每个函数都返回一个Comparable对象。然后,将按顺序调用这些函数,直到生成的Comparable对象计算为不相等或直到调用所有函数。
作者:东海陈光剑
链接:https://www.jianshu.com/p/987835b1bdfb