如何使用Kotlin中的多个比较字段按降序排序

时间:2018-04-02 13:58:58

标签: kotlin

Kotlin允许我使用多个比较字段对ASC和数组进行排序。

例如:

return ArrayList(originalItems)
    .sortedWith(compareBy({ it.localHits }, { it.title }))

但是当我尝试排序DESC(compareByDescending())时,它不允许我使用多个比较字段。

我有什么方法可以做到吗?

4 个答案:

答案 0 :(得分:23)

您可以使用thenByDescending()(或thenBy()升序)扩展功能来定义辅助Comparator

假设originalItems属于SomeCustomObject,则此类内容应该有效:

return ArrayList(originalItems)
        .sortedWith(compareByDescending<SomeCustomObject> { it.localHits }
                .thenByDescending { it.title })

(当然你必须用你自己的通用类型替换SomeCustomObject

答案 1 :(得分:4)

ArrayList(originalItems)
    .sortedWith(compareByDescending({ it.localHits }, { it.title }))

您只需定义此功能:

fun <T> compareByDescending(vararg selectors: (T) -> Comparable<*>?): Comparator<T> {
    return Comparator { b, a -> compareValuesBy(a, b, *selectors) }
}

或者您可以直接使用Comparator

ArrayList(originalItems)
    .sortedWith(Comparator { b, a -> compareValuesBy(a, b, { it.localHits }, { it.title }) })

答案 2 :(得分:2)

您也可以使用排序ASC然后将其反转:

return ArrayList(originalItems).sortedWith(compareBy({ it.localHits }, { it.title })).asReversed()

asReversed()的实现是具有反向索引的排序列表的视图,并且具有比使用reverse()

更好的性能

答案 3 :(得分:1)

反转比较器也有效:

cvode