示例代码如下:

fun main() {val map = sortedMapOf(1 to 2, 3 to 1, 2 to 3)println(map) // 输出:{1=2, 2=3, 3=1}println(map.javaClass.simpleName) // 输出:TreeMap
}

从上面例子可以看到,有序Map的实现类是TreeMap,它默认是对key进行升序排序。TreeMap的构造方法中可以接收一个比较器,是用于比较key的,所以如果我们希望降序,则可以通过传入比较器实现,代码如下:

fun main() {val comparator = kotlin.Comparator { key1: Int, key2: Int -> key2.compareTo(key1) }val map = TreeMap<Int, Int>(comparator)map[1] = 2map[3] = 1map[2] = 3println(map) // 输出:{3=1, 2=3, 1=2}
}

OK,上面代码实现了对key的降序排序。但是有时候,我们的排序需要value的参与,比如有如下数据结构:

/** 员工类 */
data class Employee(val name: String, val isOnline: Boolean)

如上是一个员工类,有姓名属性和在线状态属性,比如一个聊天软件,登录时是在线状态,离线时就是离线状态。

我们可以用一个List来表示 一个部门的所有员工,可以用一个Map<String, List>来表示一个公司多个部门的所有员工,代码示例如下:

fun main() {val 研发部人员列表 = listOf(Employee("01研发部张某某", false), Employee("01研发部王某某", false))val 销售部人员列表 = listOf(Employee("02销售部陈某某", true), Employee("02销售部李某某", false))val 售后部人员列表 = listOf(Employee("03售后部周某某", false), Employee("03售后部赵某某", true))val company = TreeMap<String, List<Employee>>()company["01研发部"] = 研发部人员列表company["02销售部"] = 销售部人员列表company["03售后部"] = 售后部人员列表company.forEach { key, value -> println(key) }
}

打印结果如下:

01研发部
02销售部
03售后部

这里打印的是部门的名称,可以看到默认是按部门名称进行升序排序的,此时我想按在线状态来排序部门,有在线状态员工的部门排在前面,如上3个部门中,研发部没有在线的人员,所以研发部应该是排在最后的,此时用key来做排序条件已经不能满足我们的需求了,Comparator对象只能对key进行排序,那如何实现使用value进行排序呢?答:自定义TreeMap的排序方法即可,但是查阅源码发现,compare方法是final类型的,不能覆盖,哎,看来TreeMap实现不了,因为它只能对key进行排序,除非我们把value的值也绑定到key中,但是这样的话,我们还不如直接使用List来实现,增加一个部门类,实现如下:

/** 员工类 */
data class Employee(val name: String, val isOnline: Boolean)/** 部门类 */
data class Department(val name: String, val employeeList: List<Employee>)

这里的Department类就相当于TreeMap类,name属性对应TreeMap的key,employeeList属性对应TreeMap的value,然后我们把多个Department保存到List中,这样就可以对List进行排序了,排序的时候就可以使用到员工列表对象了,实现代码如下:

fun main() {val 研发部人员列表 = mutableListOf(Employee("01研发部张某某", false), Employee("01研发部王某某", false))val 销售部人员列表 = mutableListOf(Employee("02销售部陈某某", true), Employee("02销售部李某某", false))val 售后部人员列表 = mutableListOf(Employee("03售后部周某某", false), Employee("03售后部赵某某", true))val 研发部 = Department("01研发部", 研发部人员列表)val 销售部 = Department("02销售部", 销售部人员列表)val 售后部 = Department("03售后部", 售后部人员列表)val company = mutableListOf(研发部, 销售部, 售后部)// 对每一个部门的人员列表进行排序,在线的排前面,离线的排后面company.forEach { department ->department.employeeList.sortByDescending { it.isOnline }}// 对部门进行排序,有在线状态的部门排前面company.sortByDescending { department ->department.employeeList[0].isOnline}company.forEach { println(it) }
}

输出结果如下:

Department(name=02销售部, employeeList=[Employee(name=02销售部陈某某, isOnline=true), Employee(name=02销售部李某某, isOnline=false)])
Department(name=03售后部, employeeList=[Employee(name=03售后部赵某某, isOnline=true), Employee(name=03售后部周某某, isOnline=false)])
Department(name=01研发部, employeeList=[Employee(name=01研发部张某某, isOnline=false), Employee(name=01研发部王某某, isOnline=false)])

对于排序,还可以加入更多的逻辑,比如在线状态相同的员工,使用员工名称排序,在线状态相同的部门,使用部门名称排序,假设我们要实现状态相同时,使用名称的降序排序,实现代码如下:

company.forEach { department ->department.employeeList.sortWith(Comparator { employee1, employee2 ->if (employee1.isOnline != employee2.isOnline) {// 状态不相同,则按状态降序排序(即在线的排前面)employee2.isOnline.compareTo(employee1.isOnline)} else {// 状态相同,则按名称升序排序employee1.name.compareTo(employee2.name)}})
}// 对部门进行排序,有在线状态的部门排前面
company.sortWith(kotlin.Comparator { department1, department2 ->if (department1.employeeList[0].isOnline != department2.employeeList[0].isOnline) {// 部门第一个员工的状态不相同,则按状态降序排序(即有在线员工的部门排前面)department2.employeeList[0].isOnline.compareTo(department1.employeeList[0].isOnline)} else {// 状态相同,则按部门名称升序排序department1.name.compareTo(department2.name)}
})

输出结果如下:

Department(name=02销售部, employeeList=[Employee(name=02销售部陈某某, isOnline=true), Employee(name=02销售部李某某, isOnline=false)])
Department(name=03售后部, employeeList=[Employee(name=03售后部赵某某, isOnline=true), Employee(name=03售后部周某某, isOnline=false)])
Department(name=01研发部, employeeList=[Employee(name=01研发部张某某, isOnline=false), Employee(name=01研发部王某某, isOnline=false)])

对于List的更多详细排序入门,可查看此文章:https://blog.csdn.net/android_cai_niao/article/details/108407853

Kotlin中的Map排序相关推荐

  1. kotlin中的Map集合类

    Kotlin中的Map分为: 只读Map. 可变的MutableMap(MutableMap.HashMap.LinkedHashMap). Map源码: private object EmptyMa ...

  2. Kotlin中的List排序

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

  3. C++中的map排序

    目录 1:map对于key(键)的排序 2:map对于value(值)的排序 1:map对于key(键)的排序 map中其实是有默认排序的,它里面的构造是用到红黑树,所以它的默认排序是按照键来排序的, ...

  4. Go语言中 经典的map排序方法及案例 (Golang经典编程案例)

    注意:Golang中的map默认是无序的,每次遍历,得到的输出结果可能不一样. Golang中的map排序: 将map的key放到切片中: 对切片排序: 遍历切片,然后来按key来输出map的值. 案 ...

  5. kotlin中map对value进行排序

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

  6. 对List中的map的key按中文拼音进行排序。

    对List中的map的key按中文拼音进行排序. private static void compareToTest() {Map<String,Object> mapTemp = new ...

  7. java map字典序_java中对map的字典序排序

    java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115& ...

  8. java对list中map集合中某个字段排序

    java对list中map集合中某个字段排序 适用于字符串排序,数字对比不可用,以下示例,当把sort的值改为74,66,142时排序不对看示例2 示例1 List<Map<String, ...

  9. golang 中 map 排序

    golang 中没有专门的 map 排序函数,且 map 默认是无序的,也就是你写入的顺序和打印的顺序是不一样的. m := make(map[string]string, 0) m["on ...

最新文章

  1. 您如何重命名MongoDB数据库?
  2. 随手记录自动化常用的一些事情
  3. java没有打印mysql日志_0216 aop和打印数据库执行日志
  4. 计算机硬件实现乘法是什么,乘法器
  5. 杭电1596find the safest road(spfa)
  6. java .class 反编译工具推荐
  7. Visio2010绘制用例图
  8. ISO27000系列标准
  9. windows下微信多开
  10. 国际贸易和计算机网络,网络对国际贸易的变革与影响.doc
  11. QQ VS MSN——QQ “只爱陌生人”,MSN “不和陌生人说话”
  12. android 4 时间限制,Android触摸精灵
  13. 京东科技风格 NutUI 发布了
  14. 一个人怎么写大型软件
  15. 青岛方言发音对照表(内附英文释义)
  16. Metal每日分享,自然饱和度滤镜效果
  17. 基于加取模和循环左移运算的扩散算法matlab
  18. rust各地辐射值_辐射率表
  19. Cascaded Human-Object Interaction Recognition论文阅读笔记
  20. 利用对话框打开一个图像文件,并显示图片

热门文章

  1. 高德地图开发从入门到精通之一:高德地图加载
  2. slimScroll 插件的应用
  3. 中国现代文学名家名作答案
  4. oracle JRockit 介绍
  5. 使用中科大源安装python库
  6. mysql中concat注意事项
  7. 网络抓包原理及Fiddler的使用
  8. Caffe训练数据转换为HD5与LMDB的代码实现
  9. 关于modelsim 10.2c建立工程出现错误:‘can‘t read “Project(EchoCompileOutput)“: no such element in array’的临时解决办法。
  10. 【华为OD机试】Excel单元格数值统计