android - 如何使用 Kotlin 可用的便捷方法按多个值和末尾的空值对集合进行排序

标签 android sorting kotlin comparator

我之前使用过sortedWithcompareBy 方法,它能够使用多个参数进行排序。

我之前也用过nullsLast方法,和其他两个一样方便。

但是,使用这些方法,我想不出一种方法来使用以下排序规则对集合进行排序:

给定类:

data class MyClass(
    val varA: String?,
    val varB: String
)
  • 根据 varA 字母顺序排序,空值/空白排在最后;然后

  • 按照varB字母顺序排序

假设我有以下集合:

val collection = listOf(
    MyClass(null, "A"),
    MyClass("a", "B"),
    MyClass("c", "C"),
    MyClass("b", "D"),
    MyClass("", "E"),
    MyClass("a", "F"),
    MyClass("b", "G"),
    MyClass(null, "H"),
    MyClass("", "I")
)

它应该被排序为:

    MyClass("a", "B")
    MyClass("a", "F")
    MyClass("b", "D")
    MyClass("b", "G")
    MyClass("c", "C")
    MyClass(null, "A")
    MyClass("", "E")
    MyClass(null, "H")
    MyClass("", "I")

有没有我可以使用的单行代码,就像使用 vararg 参数的 compareBy

最佳答案

我会这样做(参见 kotlin.comparisons documentation ):

val comparator = compareBy<String, MyClass>(nullsLast(), { it.varA.let { if (it == "") null else it } }).thenBy { it.varB }

collection.sortedWith(comparator)

关于android - 如何使用 Kotlin 可用的便捷方法按多个值和末尾的空值对集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60541834/

相关文章:

kotlin - 为什么我们使用 "companion object"作为 Kotlin 中 Java 静态字段的一种替代品?

java - Azure 函数的 CosmosDBInput 绑定(bind)未使用 HttpTrigger 中定义的路径变量

android - 交易太大异常

android - 与 Room 和 LiveData 的多对多关系

android - 如何真正为 Android 创建 Facebook 聊天客户端?

arrays - 附加到 slice 时排序?

c - 使用结构数组在 C 中进行选择排序,错误 : "lvalue required..."

python - 按未排序列表中的出现顺序对列表项进行分组

Kotlin:如何限制 block 内的范围?

Android 在应用程序中集成 google+