如何在Kotlin中使用Anko对基于两个字段的表进行排序?

时间:2018-11-16 08:36:11

标签: kotlin anko

我使用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

但是由于isFavorite为Long,代码println(list.sortedWith(compareBy({ !it.isFavorite }, MRecord::createdDate)))无法使用,该如何解决?

1 个答案:

答案 0 :(得分:1)

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

  

使用功能序列创建比较器以计算比较结果。这些函数被顺序调用,接收给定的值a和b并返回Comparable对象。一旦函数针对a和b值返回的Comparable实例的比较结果不相等,则比较器的结果将返回。

所以,请检查一下:

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)))
}

请注意如何混合使用lambda和函数引用。

为“ 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))))
}