如何根据 Kotlin 中没有任何字母或数字顺序的两个字段对列表进行重新排序或排序?

How can I reorder or sort a list based on two fields not having any alphabetical or numerical order in Kotlin?

提问人:RKB 提问时间:1/7/2021 更新时间:1/7/2021 访问量:651

问:

在我的 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,但由于状态顺序要求不是按字母顺序排列的,我无法使用内置函数来做到这一点,否则我将不得不以带有循环的肮脏方式进行操作。sortedWithcompareBy

Android 排序 Kotlin 可比

评论


答:

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