Kotlin中基于枚举的自定义对象的排序列表

scyqe7ek  于 2022-11-25  发布在  Kotlin
关注(0)|答案(5)|浏览(201)

我有一个自定义对象列表和一个枚举类。我必须根据枚举属性对列表进行排序。例如:
我的清单:

val list = listOf(Item(1,Severity.CRITICAL), Item(3, Severity.LOW), Item(2, Severity.SEVERE))

我的枚举类:

enum class Severity{
 CRITICAL, SEVERE, MODERATE, LOW
}

我的排序列表应该是:

listOf(Item(1,Severity.CRITICAL), Item(2, Severity.SEVERE), Item(3, Severity.LOW))

按照枚举类中的顺序进行排序,如何实现?

eoigrqb6

eoigrqb61#

使用sortedBy函数。它将非常容易地完成这项工作。

val ans = list.sortedBy { it.severity }
tf7tbtn2

tf7tbtn22#

只需为每个枚举附加一个值,这样就不必担心枚举类定义中的顺序。

enum class Severity(val value: Int) { 
 SEVERE(1), 
 CRITICAL(0),
 MODERATE(2), 
 LOW(3)
}

然后您可以将列表排序为:

list.sortedBy { it.serverity.value }
slhcrj9b

slhcrj9b3#

很简单。枚举:

enum class Severity() { 
    CRITICAL,
    SEVERE, 
    MODERATE, 
    LOW
}

列表:

val list = listOf(Item(1,Severity.CRITICAL), Item(3, Severity.LOW), Item(2, Severity.SEVERE))

KotlinENUM类有一个内部索引变量ordinal。它从0开始按照创建的ENUM的顺序设置。
按如下方式排序:

list.sortedBy { it.severity.ordinal }
c9x0cxw0

c9x0cxw04#

您可以从枚举创建扩展函数,如下所示:

private fun Severity.getOrder() = when(this) {
    Severity.CRITICAL -> 1
    Severity.SEVERE -> 2
    ...
}

然后,只要:

.sortedBy { it.severity.getOrder() }

这样做可以避免依赖于枚举顺序定义,并让“ordering”类设置自定义顺序。

yizd12fk

yizd12fk5#

由于enum是一个可比较的对象,因此可以通过从enum的对象中提取enum值并使用compareBy对该对象进行排序

val sortedList = list.sortedWith(compareBy { it.severity })

编辑:如果项的顺序是它的“自然”部分,则考虑实现Comparable接口,因此它将像

data class Item(val index: Int, val severity: Severity) : Comparable<Item> {
    override fun compareTo(other: Item): Int {
        return this.severity.compareTo(other.severity)
    }

}
val sortedList= list.sorted()

相关问题