【问题标题】:How to make a grouping, ordering and sorting: Kotlin collection如何进行分组、排序和排序:Kotlin 集合
【发布时间】:2019-08-15 19:51:47
【问题描述】:

我正在尝试根据 Kotlin 风格以简洁易读的方式对每个组进行分组、排序和排序。

我有一个数据类。

enum class LoadingStatus { PROCESSING, SCANNING, FAIL, FINISHED }

data class FileModel(val loadingStatus: LoadingStatus, val fileName: String, val modifiedDate: Long)

我想对FileModel的集合进行排序:

项目应按以下顺序从上到下排序:

PROCESSING → SCANNING → FINISHED → OTHER

子排序顺序:

PROCESSING → 按时间修改(AS)

SCANNING → 按时间修改 (DE)

FINISHED → 按时间修改 (DE)

OTHER → 按名称 (AS)

private fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel> 
= ...

【问题讨论】:

    标签: android sorting kotlin collections sequence


    【解决方案1】:

    这个怎么样?

    fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel> {
        val grouped = incomeList.groupBy { it.loadingStatus }
        return listOf(
            grouped[LoadingStatus.PROCESSING]?.sortedBy { it.modifiedDate }.orEmpty(),
            grouped[LoadingStatus.SCANNING]?.sortedByDescending { it.modifiedDate }.orEmpty(),
            grouped[LoadingStatus.FINISHED]?.sortedByDescending { it.modifiedDate }.orEmpty(),
            grouped[LoadingStatus.FAIL]?.sortedBy { it.fileName }.orEmpty()
        ).flatten().toMutableList()
    }
    
    

    如果你想要更多的表达,甚至可以这样做:)

    fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel> {
        val grouped = incomeList.groupBy { it.loadingStatus }
        infix fun LoadingStatus.sort(block: List<FileModel>.() -> List<FileModel>) =
            grouped[this]?.block().orEmpty()
        return listOf(
            LoadingStatus.PROCESSING sort { sortedBy { it.modifiedDate } },
            LoadingStatus.SCANNING sort { sortedByDescending { it.modifiedDate } },
            LoadingStatus.FINISHED sort { sortedByDescending { it.modifiedDate } },
            LoadingStatus.FAIL sort { sortedBy { it.fileName } }
        ).flatten().toMutableList()
    }
    
    

    【讨论】:

    • ✔️Dude,这绝对是一个完美的解决方案。看起来非常可读且易于维护。?‼️您如何看待处理 asSequence() 以避免创建开销集合的解决方案?
    • 谢谢!在我看来,在这里使用asSequence() 是没有意义的,因为无论如何你都会遍历整个列表
    • 有道理,标记为正确答案。感谢您的快速回复和您输入?
    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2011-04-04
    • 2017-11-20
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多