代码之家  ›  专栏  ›  技术社区  ›  HelloCW

如何使用kotlin中的anko对基于表的两个字段进行排序?

  •  3
  • HelloCW  · 技术社区  · 6 年前

    我使用anko来操作sqlite表,我希望根据字段对列表进行排序 isFavorite 首先,然后基于 createdDate

    例如,输入 源数据 ,我得到了 排序结果数据

    但是密码 return myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate} 不能得到正确的结果,我该怎么解决?

    源数据

    enter image description here

    排序结果数据(我希望得到)

    enter image description here

    结构

    data class MRecord (
        var _id: Long,     
        var isFavorite: Bool,   
        var createdDate: Long
    )
    

    代码

    var myList=select(tableName).parseList { MDBRecord(HashMap(it)) }        
    return myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate}
    

    添加的内容

    对疯子:谢谢!

    data class MRecord(
        var id: Long,
        var isFavorite: Long,
        var createdDate: Long
    )
    
    
    val list = listOf(
            MRecord(1, 1, 100),
            MRecord(2, 0, 200),
            MRecord(3, 1, 300)
    )
    

    我希望得到结果

    1, 1, 100
    3, 1, 300
    2, 0, 200
    

    但是密码 println(list.sortedWith(compareBy({ !it.isFavorite }, MRecord::createdDate))) 不会工作,因为我最喜欢的是长的,我怎么能修复它?

    1 回复  |  直到 6 年前
        1
  •  1
  •   madhead    6 年前

    你说得对, myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate} 不会给你正确的结果,因为它基本上等于 myList.sortedBy{ it.createdDate} (仅应用最后一个排序)。您需要的是一个比较器,它考虑了多个字段,看起来像 compareBy 你需要的是:

    使用函数序列创建比较器以计算比较结果。函数按顺序调用,接收给定的值a和b并返回可比较的对象。当函数返回的a和b值的可比较实例不相等时,比较结果将从比较器返回。

    所以,看看这个:

    data class MRecord(
        var id: Long,
        var isFavorite: Boolean,
        var createdDate: Long
    )
    
    fun main(args: Array<String>) {
        val list = listOf(
            MRecord(1, true, 10),
            MRecord(2, false, 20),
            MRecord(3, true, 30)
        )
    
        println(list)
    
        println(list.sortedWith(compareBy({ !it.isFavorite }, MRecord::createdDate)))
    }
    

    注意如何混合lambdas和函数引用。

    编辑 Long 我最喜欢 :

    data class MRecord(
        var id: Long,
        var isFavorite: Long,
        var createdDate: Long
    )
    
    fun main(args: Array<String>) {
        val list = listOf(
            MRecord(1, 1, 100),
            MRecord(2, 0, 200),
            MRecord(3, 1, 300)
        )
    
        println(list.sortedWith(compareByDescending<MRecord> { it.isFavorite }.then(compareBy(MRecord::createdDate))))
    }