Kotlin中的List排序
一、排序的简单用法
在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的使用即可。
使用sortWith实现升序排序
val userList = mutableListOf(user4, user3, user2, user1) userList.sortWith(kotlin.Comparator {u1, u2 ->u1.name.compareTo(u2.name) }) userList.forEach(::println)
使用sortWith实现降序排序
降序非常简单,把u1和u2的比较顺序交换一下即可
userList.sortWith(kotlin.Comparator {u1, u2 ->u2.name.compareTo(u1.name)})
使用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排序相关推荐
- 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 ...
- kotlin中map对value进行排序
kotlin中对HashMap的排序和java中有些不同 java 重写Comparator Map<String, String> map = new HashMap<String ...
- Kotlin中的数据存储
数据存储 1 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据仍然不会丢失. 保存在内存中的数据是处于瞬时状态的,而保存在存储设备中 ...
- kotlin中继承父属性使用构造方法
kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...
- Kotlin 中 switch 写法
在Kotlin 中并没有switch 操作符 , 取而代之的是when java的写法: int i= 5;switch (i){case 5:System.out.print("5&quo ...
- mysqlorderby数字字符串排序_Python中的元组排序和深度比较
比较Python中的东西.这听起来几乎是不需要教的,但是我发现Python的比较运算符经常被Python新手误解和低估. 我们来回顾一下Python的比较运算符如何处理不同类型的对象,然后看看如何使用 ...
- kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常
kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...
- Kotlin中使用简洁明了的代码替换findViewByid
第一种(推荐使用) Kotlin Android 扩展插件(Android Studio 内置) 首先添加 apply plugin: 'kotlin-android-extensions' 官方示例 ...
- pandas中dataframe索引排序实战:pandas中dataframe索引降序排序、pandas中dataframe索引升序排序
pandas中dataframe索引排序实战:pandas中dataframe索引降序排序.pandas中dataframe索引升序排序 目录
最新文章
- [PKUWC2018]随机算法
- Android 设计模式:(三)装饰者模式 —— 装饰对象
- Openstack组件部署 — Nova_Install and configure a compute node
- linux+C环境下动态管理头文件和库文件
- html input font size,在移动端中Input大小随着font-size而变化
- CPU+GPU异构计算完全解析
- java11下载_JDK11 JAVA11下载安装与快速配置环境变量教程
- SQL Server语句
- Title:eNSP 映射到外网
- php 滑动 图片,JQuery图片滑动
- compser 执行命令提示do not run composer as root/super !
- 先序中序建立二叉树的递归算法
- Python3 AES加解密(AES/ECB/PKCS5Padding)
- Selenium FirePath的安装和使用
- VS2019创建COM组件
- 网络嗅探器(影音神探) v4.63 绿色正式版http://down.hotlife.cn/html/download/2006/6/05/1149478572.shtml
- 【前端】Qt简明教程
- 你不能错过的高效率工具:第1期
- mssql 数据库审计账户_mssql 数据库所有者
- CRM系统优化工作效率与质量