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
}
}
我从请求信息中接收数据作为列表 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
}
}