Kotlin允许我使用多个比较字段对ASC和数组进行排序。
例如:
return ArrayList(originalItems)
.sortedWith(compareBy({ it.localHits }, { it.title }))
但是当我尝试排序DESC(compareByDescending()
)时,它不允许我使用多个比较字段。
我有什么方法可以做到吗?
答案 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