Philipp Buhaievskiy
Philipp Buhaievskiy

Reputation: 3827

How to make a grouping, ordering and sorting: Kotlin collection

I'm trying to make a grouping, ordering and sorting per each group a collection according to a Kotlin style as much concise and readable way.

I have a data class.

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

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

I'd like to sort a collection of FileModel:

Items are should be sorted in the following order from top to bottom:

PROCESSING → SCANNING → FINISHED → OTHER

SubSorting order:

PROCESSING → by time modified (AS)

SCANNING → by time modified (DE)

FINISHED → by time modified (DE)

OTHER → by name (AS)

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

Upvotes: 0

Views: 1063

Answers (1)

Andrei Tanana
Andrei Tanana

Reputation: 8442

How about this?

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

or even this if you want more expression :)

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

Upvotes: 1

Related Questions