我如何根据两个在 Kotlin 中没有任何字母或数字顺序的字段对列表进行重新排序或排序?
How can I reorder or sort a list based on two fields not having any alphabetical or numerical order in Kotlin?
在我的 Android 应用程序中,我有一个包含以下字段的自定义对象列表,
var myNotesList: ArrayList<Note>
class Note(
var title: String
var date: String,
var status: String)
这里的status
可以是以下三个值中的任意一个:
Draft, Pending, Completed
现在,我希望我的列表按以下方式排序:首先是草稿,然后按日期的降序排序,然后按日期排序待定,然后按完成状态项排序。
例如,
{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}
我已经尝试使用 sortedWith
和 compareBy
但是由于状态顺序要求不是按字母顺序排列的,我无法使用内置函数来执行此操作,否则我将不得不用循环的肮脏方式来做。
我看不出不做一些肮脏的比较器来对你的数组进行排序的方法,就像这样用于状态(对于日期它会更脏):
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 对象)允许您将字符串日期转换为 LocalDate 对象。
所以你的最终对象看起来像:
class Note(
var title: String,
var date: LocalDate,
var status: Status)
然后你可以简单地做:
myNotesList.sortedWith(compareBy<Note>({it.status}).thenByDescending({it.date})))
在我的 Android 应用程序中,我有一个包含以下字段的自定义对象列表,
var myNotesList: ArrayList<Note>
class Note(
var title: String
var date: String,
var status: String)
这里的status
可以是以下三个值中的任意一个:
Draft, Pending, Completed
现在,我希望我的列表按以下方式排序:首先是草稿,然后按日期的降序排序,然后按日期排序待定,然后按完成状态项排序。
例如,
{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}
我已经尝试使用 sortedWith
和 compareBy
但是由于状态顺序要求不是按字母顺序排列的,我无法使用内置函数来执行此操作,否则我将不得不用循环的肮脏方式来做。
我看不出不做一些肮脏的比较器来对你的数组进行排序的方法,就像这样用于状态(对于日期它会更脏):
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 对象)允许您将字符串日期转换为 LocalDate 对象。
所以你的最终对象看起来像:
class Note(
var title: String,
var date: LocalDate,
var status: Status)
然后你可以简单地做:
myNotesList.sortedWith(compareBy<Note>({it.status}).thenByDescending({it.date})))