sorting - 使用 Kotlin 按多个条件排序

标签 sorting kotlin

我们想根据三个不同的标准对对象进行排序,优先级较高的标准会覆盖下一个):

  1. 状态字段
  2. 时间字段
  3. 排序字段
  • status 是枚举并且有自定义排序,这是我们通过比较器实现的。 (未知,开放,封闭,)
  • sortBy 字段是一个整数,可以进行相应的排序
  • time字段可以为null,我们只想让null排到最前面,其余排序保持原样

示例:

  • 对象 1(状态:打开,时间:1,排序:4)
  • 对象 2(状态:关闭,时间:null,排序:1)
  • 对象 3(状态:未知,时间:2,排序:3)
  • 对象 4(状态:未知,时间:空,排序:2)
  • 对象5(状态:打开,时间:1,排序:5)

排序:

  1. 对象 3(状态:未知)
  2. 对象 4(状态:未知,原始列表中的下一项)
  3. 对象 2(状态!= 未知,时间:空)
  4. 对象 1(状态 != 未知,时间 != null,排序:4)
  5. 对象 5(状态 != 未知,时间 != null,排序:5)

我们按以下方式返回列表:

list.sortedWith(statusComparator.thenBy { it.sort }

缺少的是对 time = null 的项目进行排序。 如何将 time = null 的项目排序到顶部并保持其余排序不变?

最佳答案

要根据值是否为 null 进行排序,我们可以...正是这样做,通过检查它是否为 null 来排序:

list.sortedWith(
    statusComparator
        .thenBy { it.time != null }
        .thenBy { it.sort }
)

它有效,因为 false 被认为小于 true。对于任何非空值,它都返回 true,因此所有非空值都被认为是相同的。

我们可以将 timesort 步骤合并为一个步骤,如果 time 为 null 则返回 null 并且 sort否则:

.thenBy { item -> item.time?.let { item.sort } }
// or:
.thenBy { if (it.time == null) null else it.sort }

它的性能可能会更高一些,但我认为这更难理解且不太灵活。

关于sorting - 使用 Kotlin 按多个条件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71122798/

相关文章:

python - QSortFilterProxyModel 不应用 SortRole

python - 如何按多个键对对象进行排序?

c++ - 为什么我们在对自定义对象的 vector 进行排序时在结构定义中包含比较函数?

iphone - NSMutableArray of Dictionaries中的replaceobjectatindex

android - 使用 RecyclerView 的房间数据库 View

java - 如何对具有两个对象字段的列表进行排序?

kotlin - 通过POJO伪装QueryMap的用法

android - 类型不匹配。必需 : Nothing Found: Callback<*>

android - Kotlin 中的异步匿名函数? ( lambda 表达式)

android - 如何使用 firebase auth android 无法返回 android