Kotlin 对带有键的列表和带有键和顺序的枚举进行排序

Kotlin sort one List with key and Enum with key and order

我从请求信息中接收数据作为列表 data (List) 下面的代码。该数据有一个“关键”参数,我想根据它对其进行排序。

data class ApplianceSetting(
    @SerializedName("key") val key: String,
    @SerializedName("value") var value: Any,
    (...)

我在 SettingsUtilEnum 中有所需的顺序,并希望按该顺序对项目进行排序。

之后,我可以使用 map{} 转换列表 data 并使用 Enum getSettingByMode() 的函数并获得枚举值列表。然后我将它们排序并再次将它们转换为列表。 但这听起来效率太低了。有没有更好的办法。

enum class SettingsUtilEnum(
   var settingKey: String,
   override val order: Int = 99,
   var settingName: String = "",
) : AbstractOrderEnum {

FIRST_MODE("first.mode", 0),
SECOND_MODE("second.mode", 1),
(...)
UNKNOWN_MODE("", 99);

companion object {
    @JvmStatic
    fun getSettingByMode(settingKey: String): SettingsUtilEnum? {
        return values().find { it.settingKey == settingKey }
    }

k

 private fun initDataObserver() {
    (activity as FavouriteActivity).viewModel.applianceSettings.observe(activity as FavouriteActivity
    ) { data ->
        (controlRecyclerView.adapter as FavouriteAdditionalControlsAdapter)
        val adapter = (controlRecyclerView.adapter as FavouriteAdditionalControlsAdapter)
        // public final var data: List<ApplianceSetting>

        // old code:
            // data.settings
        adapter.data = sortAndGetControlModes(data)

        adapter.notifyDataSetChanged()
    }
}

// TODO: sortAndGetControlModes
private fun sortAndGetControlModes(data: ApplianceSettingsList) =
    data.settings.map {
        getSettingByMode(it.key)
            ?: UNKNOWN_MODE.apply {
                // If in future new modes are added -> put them as tail
                settingKey = it.key
            }
    }.sortedBy { it.order }
    // error i need to return again List<ApplianceSetting>

我使用 sortedBy 修复了它,作为比较器,我使用从 getSettingByMode() 接收到的值(顺序),如果找不到项目(null),我给他的顺序值为 99 并将其放在尾部位置:

    private fun sortAndGetControlModes(data: ApplianceSettingsList) =
         data.settings.sortedBy { 
             getSettingByMode(it.key)?.order ?:99 
         }

如果您想将键与它们的 ASCII 值进行比较,您可以使用 sortBy { it.key }

如果您想扩展比较的可能性,您可以使用函数 sortedWith 并将自定义 comparator 作为参数传递。

比较器用于比较其两个参数的顺序。 Returns 如果参数相等则为零,如果第一个参数小于第二个则为负数,如果第一个参数大于第二个则为正数。

示例: 如果你想按 key 参数的整数值排序,你可以像这样使用它:

data.settings.sortedWith { a, b ->
      when {
            a.key.toInt() < b.key.toInt() -> -1
            a.key.toInt() > b.key.toInt() -> 1
            else -> 0
      }
}