gpt4 book ai didi

comparable - 如何根据/比较 Kotlin 中的多个值进行排序?

转载 作者:IT老高 更新时间:2023-10-28 13:26:12 26 4
gpt4 key购买 nike

假设我有一个 class Foo(val a: String, val b: Int, val c: Date) 我想对 Foo 的列表进行排序在所有三个属性上。我该怎么办?

最佳答案

Kotlin 的标准库为此提供了许多有用的辅助方法。

首先,您可以使用 compareBy() 定义一个比较器。方法并将其传递给 sortedWith() 扩展方法来接收列表的排序副本:

val list: List<Foo> = ...
val sortedList = list.sortedWith(compareBy({ it.a }, { it.b }, { it.c }))

第二,你可以让Foo实现Comparable<Foo>使用 compareValuesBy() 辅助方法:

class Foo(val a: String, val b: Int, val c: Date) : Comparable<Foo> {
override fun compareTo(other: Foo)
= compareValuesBy(this, other, { it.a }, { it.b }, { it.c })
}

然后您可以调用 sorted() 不带参数的扩展方法来接收列表的排序副本:

val sortedList = list.sorted()

排序方向

如果您需要对某些值进行升序排序,而对其他值进行降序排序,stdlib 还提供了相应的功能:

list.sortedWith(compareBy<Foo> { it.a }.thenByDescending { it.b }.thenBy { it.c })

性能考虑

vararg compareValuesBy 的版本未在字节码中内联,这意味着将为 lambdas 生成匿名类。但是,如果 lambdas 本身不捕获状态,则将使用单例实例而不是每次都实例化 lambdas。

Paul Woitaschek 所述在评论中,与多个选择器进行比较将每次都为可变参数调用实例化一个数组。您无法通过提取数组来优化这一点,因为它将在每次调用时被复制。另一方面,您可以将逻辑提取到静态比较器实例中并重用它:

class Foo(val a: String, val b: Int, val c: Date) : Comparable<Foo> {

override fun compareTo(other: Foo) = comparator.compare(this, other)

companion object {
// using the method reference syntax as an alternative to lambdas
val comparator = compareBy(Foo::a, Foo::b, Foo::c)
}
}

关于comparable - 如何根据/比较 Kotlin 中的多个值进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com