首页 > 其他分享 >kotlin列表排序

kotlin列表排序

时间:2022-09-05 17:44:06浏览次数:93  
标签:isOnline name val kotlin 列表 userList User 排序

一、排序的简单用法

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进行开发可以节省我们大量的宝贵时间。

标签:isOnline,name,val,kotlin,列表,userList,User,排序
From: https://www.cnblogs.com/zhangwenju/p/16658993.html

相关文章

  • 【笔记】拓扑排序(Ⅰ)
    题单拓扑排序:将一个有向无环图\((\Directed\Acyclic\Graph,DAG\)\)进行排序进而得到一个有序的线性序列。简单食用方法:\(vector\)存图,再用\(queue\)跑\(BFS\)。......
  • Problem P07. [算法课分治] 链表排序(归并排序)
    采用归并算法,先将一个链表分成两个链表,分到不能再分,然后再将已经排好序的链表有序地归并起来。主要问题:1.一个子链表如何分成两个。2.释放空间的问题(没有实现)#inclu......
  • Python列表、元祖、字典查询速度对比
    先比较列表和字典的查询速度:字典查询速度快于列表,原因是:列表是有序的数组,每个值都有自己的索引位置,查询的时候会逐步偏移查找,很浪费时间,但是内存消耗小。而字典是key,value......
  • Stream流进行数组排序
    ​考虑一个数组:int[]nums={9,6,5,7,4,8,3,1,2};对于数组,列举几个转换Stream流的操作及返回值://返回Stream对象,但泛型为int[]数组Stream<int[]>nums1=Stream.of(n......
  • LeetCode 1387. 按幂值对整数进行排序
    LeetCode1387.按幂值对整数进行排序剛從南湖群峰下山,原本受了現在好像又胖回去了(哭[按幂值排序整数-LeetCode整数x的幂定义为使用以下步骤将x转换为1所需的......
  • js 实现计数排序
    //计数排序//稳定性:稳定//定义一个数组,将数组中每个元素出现的次数以数组形式保存起来,数组索引值即为具体key,数组索引对应的元素值即为该索引值出现的次数//再将......
  • 十大排序算法之【插入排序】
    插入排序的原理很简单:斗地主理牌的时候怎么操作就怎么操作。最简易版代码实现:#include<bits/stdc++.h>voidinsert_sort(vector<int>&in){for(inti=0;i<in.s......
  • leetcode 83. Remove Duplicates from Sorted List 删除排序链表中的重复元素(简单)
    一、题目大意给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:h......
  • 数据结构与算法【Java】05---排序算法总结
    前言数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码。要学习好数据结构就......
  • Python 中的冒泡排序和解释 - 教程。
    Python中的冒泡排序和解释-教程。冒泡排序是您比较相邻值并相应地交换它的地方。这种排序算法有一些应用,其中一些是对数据库中的数据进行排序,例如:按价格对亚马逊产品进......