首页 文章

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

提问于
浏览
10

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

例如:

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

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

有什么办法可以吗?

4 回答

  • 1

    你也可以使用sort ASC然后反转它:

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

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

  • 1

    反转比较器也有效:

    originalItems.sortedWith(compareBy<Item>({ it.localHits }, { it.title }).reversed())
    
  • 15
    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

    您可以使用 thenByDescending() (或升序为 thenBy() )扩展函数来定义辅助 Comparator .

    假设 originalItemsSomeCustomObject ,这样的事情应该有效:

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

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

相关问题