Kotlin通用对象排序:如何按对象列表参数计数或大小排序

xzlaal3s  于 2022-12-23  发布在  Kotlin
关注(0)|答案(1)|浏览(138)

我为Kotlinjs项目编写了一个漂亮的泛型函数,它将按参数对对象列表进行排序。
例如,book对象的列表如下所示

data class Book(val id: Int, val title: String, val year: Int, val authors:List<Author>)

将按泛型函数排序:

fun <T> sortColumnData(data: List<T>, direction: SORTDIRECTION, selector: KProperty1<T, Comparable<*>>) :List<T> {
    val sortedData = when (direction) {
        SORTDIRECTION.UP -> data.sortedWith(compareBy(selector))
        SORTDIRECTION.DOWN -> data.sortedWith(compareByDescending(selector))
    }
    return sortedData
}

而且,我可以非常方便地传入选择器:书籍::书名
我需要一些指导,如何编写一个sortColumnData函数,将排序的作者计数。

ercv8c1e

ercv8c1e1#

无需重新发明轮子,请参阅Kotlin标准库Ordering|Kotlin

data class Author(val name: String)
data class Book(val id: Int, val title: String, val year: Int, val authors: List<Author>)

val authorA = Author("A")
val authorB = Author("B")

val list = listOf(
    Book(1, "Book 1", 2000, listOf(authorA)),
    Book(2, "Book 2", 2000, listOf(authorA)),
    Book(3, "Book 3", 2000, listOf(authorA, authorB)),
    Book(4, "Book 4", 2000, listOf(authorB))
)

list.sortedBy { it.title }.forEach(::println)
list.sortedByDescending { it.title }.forEach(::println)

list.sortedBy { it.authors.size }.forEach(::println)
list.sortedByDescending { it.authors.size }.forEach(::println)

也可以使用方法引用:

val result = list.sortedBy(Book::title)

其等效于:

val result = list.sortedBy { it.title }

对于 list.sortedBy { it.authors.size },无法使用方法引用。

相关问题