提问人:RKB 提问时间:1/7/2021 更新时间:1/7/2021 访问量:651
如何根据 Kotlin 中没有任何字母或数字顺序的两个字段对列表进行重新排序或排序?
How can I reorder or sort a list based on two fields not having any alphabetical or numerical order in Kotlin?
问:
在我的 Android 应用程序中,我有一个包含以下字段的 Custom 对象列表,
var myNotesList: ArrayList<Note>
class Note(
var title: String
var date: String,
var status: String)
此处可以是以下三个值中的任何一个:status
草稿、待定、已完成
现在,我希望我的列表按照以下方式排序:首先是草稿,然后按日期降序排序,然后是“待处理”,然后是“已完成”状态项。
例如
{someNoteTitle, draft, 07 Jan 2021},
{someNoteTitle, draft, 06 Jan 2021},
{someNoteTitle, draft, 04 Jan 2021},
{someNoteTitle, Pending, 07 Jan 2021},
{someNoteTitle, Pending, 06 Jan 2021},
{someNoteTitle, Completed, 07 Jan 2021},
{someNoteTitle, Completed, 05 Jan 2021},
{someNoteTitle, Completed, 02 Jan 2021}
我已经尝试过 and,但由于状态顺序要求不是按字母顺序排列的,我无法使用内置函数来做到这一点,否则我将不得不以带有循环的肮脏方式进行操作。sortedWith
compareBy
答:
1赞
bcordier
1/7/2021
#1
如果不做一些肮脏的比较器来对你的数组进行排序,我看不出有什么办法,比如这样的状态(以及日期它会更脏):
myNotesList.sortedWith(object: Comparator<String> {
override fun compare(a: String, b: String): Int {
return when {
a == "DRAFT" && b == "PENDING" -> -1
a == "DRAFT" && b == "COMPLETED" -> -1
a == "PENDING" && b == "DRAFT" -> 1
a == "PENDING" && b == "COMPLETED" -> -1
a == "COMPLETED" && b == "PENDING" -> 1
a == "COMPLETED" && b == "DRAFT" -> 1
else -> 0
}
}
})
我要做的是通过使用可以按照我想要的方式排序的类型来更改 Note 对象。如果您无法更改 Note 对象,我将创建另一个对象并创建一个映射器以将 Note 映射到新类型。
例如,首先我会为带有枚举的注释状态创建一个对象(但您必须小心,因为顺序将与枚举项顺序相关联,这有时会导致问题)
enum class Status {
DRAFT,
PENDING,
COMPLETED
}
对于日期,我将使用 Date 对象,例如 LocalDate。再一次,映射器(如果无法更改 Note 对象)将允许您将 String 日期转换为 LocalDate 对象。
所以你的最终对象将看起来像:
class Note(
var title: String,
var date: LocalDate,
var status: Status)
然后你可以简单地做:
myNotesList.sortedWith(compareBy<Note>({it.status}).thenByDescending({it.date})))
评论
0赞
RKB
1/7/2021
是的,我正在考虑这种使用方法,@IR42在对我的问题的评论中也建议这样做。让我尝试一下,因为我需要从 String 更改日期字段类型。Enum
评论