一、排序的简单用法

在Java中,对List进行排序可以使用Collections.sort()方法,在Kotlin中有非常简单的语法糖,所以这里记录一下,开发中尽量用简单的方式,方便维护。

一段未排序的示例代码如下:

data class User(val name: String, val isOnline: Boolean)fun main() {val user1 = User("1", false)val user2 = User("2", false)val user3 = User("3", true)val user4 = User("4", true)val userList = mutableListOf(user4, user3, user2, user1)userList.forEach(::println)
}

输出结果如下:

User(name=4, isOnline=true)
User(name=3, isOnline=true)
User(name=2, isOnline=false)
User(name=1, isOnline=false)

我们希望按用户名进行排序,实现代码如下:

userList.sortBy { user -> user.name }             // 指定以name属性进行升序排序
userList.sortByDescending { user -> user.name } // 指定以name属性进行降序排序

升序排序的打印结果如下:

User(name=1, isOnline=false)
User(name=2, isOnline=false)
User(name=3, isOnline=true)
User(name=4, isOnline=true)

Kotlin中的排序就是这么简单,如果我们把列表声明为不可变的列表,则不能使用sortBy或sortByDescending方法,因为列表不可以改变嘛。对于不可变列表的排序可以使用sortedBy或sortedBytDescending方法,方法名差不多,只是多了ed两个字母,它的实现是创建一个新的列表来保存排序后的结果,示例如下:

val userList = listOf(user4, user3, user2, user1)
val newList = userList.sortedBy { user -> user.name }
newList.forEach(::println)

二、排序的高级用法

查看sortBy和sortByDescending的源码发现,其是通过调用sortWith方法实现的,对应的sortedBy和sortedByDescending则是通过调用sortedWith方法实现的,sortWith的功能和sortedWith的功能原理是一样的,所以我这里讲清楚sortWith的使用即可。

  1. 使用sortWith实现升序排序

    val userList = mutableListOf(user4, user3, user2, user1)
    userList.sortWith(kotlin.Comparator {u1, u2 ->u1.name.compareTo(u2.name)
    })
    userList.forEach(::println)
    
  2. 使用sortWith实现降序排序

    降序非常简单,把u1和u2的比较顺序交换一下即可

    userList.sortWith(kotlin.Comparator {u1, u2 ->u2.name.compareTo(u1.name)})
    
  3. 使用sortWith实现多重排序

    sortBy只能指定一个属性参与排序,并且此属性对象必须已经实现了Comparable接口,通过调用该接口的compare方法进行排序,而使用sortWith则可以指定多个属性参与排序,属性不需要实现Comparable接口,可以自己定制排序的逻辑。

    假设我们希望按用户的在线状态排序,在线的排前面,离线的排后面,状态相同的情况下再按名称排序,实现代码如下:

    fun main() {val user1 = User("1", false)val user2 = User("2", false)val user3 = User("3", true)val user4 = User("4", true)val userList = mutableListOf(user2, user1, user4, user3)println("排序前:")userList.forEach(::println)userList.sortWith(kotlin.Comparator { u1, u2 ->if (u1.isOnline != u2.isOnline) {u2.isOnline.compareTo(u1.isOnline) // 状态以降序排序} else {u1.name.compareTo(u2.name)         // 名字以升序排序}})println("排序后:")userList.forEach(::println)
    }
    

    输出结果如下:

    排序前:
    User(name=2, isOnline=false)
    User(name=1, isOnline=false)
    User(name=4, isOnline=true)
    User(name=3, isOnline=true)排序后:
    User(name=3, isOnline=true)
    User(name=4, isOnline=true)
    User(name=1, isOnline=false)
    User(name=2, isOnline=false)
    

    再一次感受到了Kotlin的强大,真是太方便了,使用Kotlin进行开发可以节省我们大量的宝贵时间。

Kotlin中的List排序相关推荐

  1. Kotlin中的Map排序

    示例代码如下: fun main() {val map = sortedMapOf(1 to 2, 3 to 1, 2 to 3)println(map) // 输出:{1=2, 2=3, 3=1}p ...

  2. kotlin中map对value进行排序

    kotlin中对HashMap的排序和java中有些不同 java 重写Comparator Map<String, String> map = new HashMap<String ...

  3. Kotlin中的数据存储

    数据存储 1 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据仍然不会丢失. 保存在内存中的数据是处于瞬时状态的,而保存在存储设备中 ...

  4. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  5. Kotlin 中 switch 写法

    在Kotlin 中并没有switch 操作符 , 取而代之的是when java的写法: int i= 5;switch (i){case 5:System.out.print("5&quo ...

  6. mysqlorderby数字字符串排序_Python中的元组排序和深度比较

    比较Python中的东西.这听起来几乎是不需要教的,但是我发现Python的比较运算符经常被Python新手误解和低估. 我们来回顾一下Python的比较运算符如何处理不同类型的对象,然后看看如何使用 ...

  7. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常

    kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...

  8. Kotlin中使用简洁明了的代码替换findViewByid

    第一种(推荐使用) Kotlin Android 扩展插件(Android Studio 内置) 首先添加 apply plugin: 'kotlin-android-extensions' 官方示例 ...

  9. pandas中dataframe索引排序实战:pandas中dataframe索引降序排序、pandas中dataframe索引升序排序

    pandas中dataframe索引排序实战:pandas中dataframe索引降序排序.pandas中dataframe索引升序排序 目录

最新文章

  1. [PKUWC2018]随机算法
  2. Android 设计模式:(三)装饰者模式 —— 装饰对象
  3. Openstack组件部署 — Nova_Install and configure a compute node
  4. linux+C环境下动态管理头文件和库文件
  5. html input font size,在移动端中Input大小随着font-size而变化
  6. CPU+GPU异构计算完全解析
  7. java11下载_JDK11 JAVA11下载安装与快速配置环境变量教程
  8. SQL Server语句
  9. Title:eNSP 映射到外网
  10. php 滑动 图片,JQuery图片滑动
  11. compser 执行命令提示do not run composer as root/super !
  12. 先序中序建立二叉树的递归算法
  13. Python3 AES加解密(AES/ECB/PKCS5Padding)
  14. Selenium FirePath的安装和使用
  15. VS2019创建COM组件
  16. 网络嗅探器(影音神探) v4.63 绿色正式版http://down.hotlife.cn/html/download/2006/6/05/1149478572.shtml
  17. 【前端】Qt简明教程
  18. 你不能错过的高效率工具:第1期
  19. mssql 数据库审计账户_mssql 数据库所有者
  20. CRM系统优化工作效率与质量

热门文章

  1. netty实现网络推送
  2. vi 永久显示行号设置
  3. android通过usb调试安装apk后 卸载 无法安装release版 魅族note1 note3
  4. 徐磊 10,11,12,13,14, 形容词性从句
  5. Android ImageView高度自适应
  6. 浅述 国产 仪器 4456系列数字荧光示波器
  7. (5)惯性推算失控保护
  8. 软测5班课程-软件测试概论
  9. 即兴编程: 如何通过编程表达个人情感
  10. VScode 配置 Java 开发环境(最简单的纯小白带图版)