Kotlin 中的集合类排序Kotlin 开发者社区

KotlinSorting.gif

1.概述

Kotlin使用扩展方法构建在Java Collection框架之上。这大大提高了可用性和可读性,而无需第三方依赖,如Apache CommonsGuava

在本教程中,我们将重点关注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方法。

此外,我们可以使用sortDescendingreverse方法按降序排序

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方法。

像以前一样,对于降序,我们可以使用sortByDescendingreverse方法。

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对象计算为不相等或直到调用所有函数。

在下一个例子中,第一个值用于比较,并且只有当值相等时,才会调用it.second来打破平局:

val complexComparator = compareBy<Pair<Int, String?>>({it.first}, {it.second})

随意探索kotlin.comparisons以发现所有可用的工厂。

4。结论

在本快速教程中,我们了解了如何使用sortsortBysortWith方法对Kotlin中的集合进行排序。

之后,我们还使用kotlin.comparisons包来创建Comparator对象,并使用其他排序规则来增强它们。

可以在GitHub上找到所有这些示例和代码段的实现。

原文参考:https://www.baeldung.com/kotlin-sort

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华仔的技术笔记

再议Block

2957
来自专栏jessetalks

背后的故事之 - 快乐的Lambda表达式(二)

快乐的Lambda表达式   上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式。知道了它和委托以及普通方法的区...

2764
来自专栏用户画像

7.7.1外部排序

内部排序都是在内存中进行的,而在实际应用中,经常需要对大文件进行排序,因为文件中的记录很多、信号量庞大,无法将整个文件拷贝进内存中进行排序。因此,需要将待排序的...

721
来自专栏我杨某人的青春满是悔恨

深入理解 weak-strong dance

这时handler持有 Block 对象,而 Block 对象虽然捕获了weakSelf,延长了weakSelf这个局部变量的生命周期,但weakSelf是附有...

974
来自专栏Python小屋

Python函数中单独一个星号或斜线作为形参的含义

在函数定义时,位于*parameter或单独一个星号*之后的所有参数都只能以关键参数的形式进行传值,不接收其他任何形式的传值。 >>> def demo(a, ...

3636
来自专栏从流域到海域

《笨办法学Python》 第18课手记

《笨办法学Python》 第18课手记 本节课将创建函数,跟C语言里面的的定义函数差不多。 作者在每个函数开头都加了解释该函数功能的英文注释。为了方便理解,我将...

1938
来自专栏简书专栏

Python程序结构

4种流程控制语句结构: if if -- else if -- elif --else if多条件

2632
来自专栏HansBug's Lab

1901: Zju2112 Dynamic Rankings

1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: ...

2766
来自专栏lgp20151222

java 核心技术 读后总结

如 AbcController和AbcService两个文件,javac Abc*.java 即可一次性编译两个

712
来自专栏伪君子的梦呓

华氏温度转摄氏温度~ C++ 做法

题目链接:http://www.dotcpp.com/oj/problem1005.html

1213

扫码关注云+社区

领取腾讯云代金券