kotlin 如何按枚举中的顺序对arrayList进行排序

g2ieeal7  于 2023-03-19  发布在  Kotlin
关注(0)|答案(3)|浏览(180)

我有一个特定顺序的颜色枚举。我如何排序我的arrayList颜色以匹配我的枚举中声明的顺序?

enum class ColorsEnum(val rawValue: String) {
    red("Red"),
    orange("Orange"),
    yellow("Yellow"),
    green("Green"),
    blue("Blue")

}


fun orderByEnum(): String {

    val selectedColors  = arrayListOf("Red", "Yellow", "Orange", "Blue", "Green")

    //sort selectedColors by the order in the enum

    return selectedColors.joinToString(", ")
    //should return "Red, Orange, Yellow, Green, Blue"

}
uujelgoq

uujelgoq1#

假设你说的是arrayListOf("Red", "Yellow", "Orange", "Blue", "Green")

selectedColors.sortBy { colorName ->
    ColorsEnum.values()
        .find { it.rawValue == colorName }
        ?.let(ColorsEnum.values()::indexOf)
}

说明:

  • sortBy扩展函数根据指定选择器函数返回的值的自然排序顺序就地排序列表中的元素。
  • 然后我们使用find { it.rawValue == colorName }查找哪个枚举具有这个特定的rawValue
  • 最后,我们使用ColorsEnum.values()::indexOf按声明顺序返回此枚举的索引。
ukdjmx9f

ukdjmx9f2#

enum class ColorsEnum(val rawValue: String) {
  Red("Red"),
  Orange("Orange"),
  Yellow("Yellow"),
  Green("Green"),
  Blue("Blue")
}

val input = listOf("Red", "Yellow", "Orange", "Blue", "Green")

val sortOrderMap = ColorsEnum.values().associateBy { it.rawValue }
val result = input.sortedBy { sortOrderMap[it] }.joinToString(", ")

println(result)   // Output: Red, Orange, Yellow, Green, Blue
xriantvc

xriantvc3#

只需使用sortBy函数就可以非常容易地实现这一点。

selectedColors.sortBy { ColorsEnum.valueOf(it.toLowerCase()) }

建议对枚举名称使用大写命名。

enum class ColorsEnum(val rawValue: String) {
    RED("Red"),
    ORANGE("Orange"),
    // etc
}

然后,还应使用以下内容更新sortBy

selectedColors.sortBy { ColorsEnum.valueOf(it.toUpperCase()) }

相关问题