我使用Anko操作SQLite表,我希望首先根据字段isFavorite
对列表进行排序,然后再基于createdDate
例如,输入Source Data,然后得到Sort Result Data
但是代码return myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate}
无法获得正确的结果,如何解决?
源数据
排序结果数据(希望得到)
结构
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)))
无法使用,如何解决? 最佳答案
没错,myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate}
不会给您正确的结果,因为它基本上等于myList.sortedBy{ it.createdDate}
(仅适用最后一种排序方式)。您需要的是一个比较器,该比较器考虑了多个字段,看起来像 compareBy
是您所需要的:
因此,请查看以下内容:
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
isFavorite :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))))
}