我如何根据两个在 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}

我已经尝试使用 sortedWithcompareBy 但是由于状态顺序要求不是按字母顺序排列的,我无法使用内置函数来执行此操作,否则我将不得不用循环的肮脏方式来做。

我看不出不做一些肮脏的比较器来对你的数组进行排序的方法,就像这样用于状态(对于日期它会更脏):

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