天天看點

Kotlin 中的集合類排序

Kotlin 中的集合類排序

KotlinSorting.gif

1.概述

Kotlin使用​​擴充方法​​​建構在Java Collection架構之上。這大大提高了可用性和可讀性,而無需第三方依賴,如​​Apache Commons​​​或​​Guava​​。

在本教程中,我們将重點關注Kotlin中的排序。此外,我們将使用kotlin.comparisons包來實作複雜的排序規則。

2.對集合進行排序

Kotlin提供了多個實用程式,使分類集合的過程更容易。讓我們探讨其中幾種方法。

2.1。分類

對集合進行排序的最簡單方法是調用sort方法。**此方法将使用元素的自然順序。此外,預設情況下它會按升序排序,是以'a'在'b'之前,'1'在'2'之前:

fun main(args: Array<String>) {
    val intArray = mutableListOf(1,2,6,3,7,9,4)
    intArray.sort()
    println(intArray) // [1, 2, 3, 4, 6, 7, 9]

}      

以上代碼的結果是:

[1, 2, 3, 4, 6, 7, 9]      

重要的是要注意我們使用了一個可變的集合。其原因是,在那種方法就地進行排序。如果我們希望将結果作為新清單傳回,那麼我們隻需要使用sorted方法。

此外,我們可以使用sortDescending或reverse方法按降序排序。

2.2。排序方式

如果我們需要按給定對象的特定屬性進行排序,我們可以使用sortBy。 該sortBy方法允許我們通過一個選擇器功能作為參數。選擇器函數将接收對象,并應傳回我們要排序的值:

fun main(args: Array<String>) {
    val mapList = mutableListOf(1 to "A" , 2 to "B", 5 to "C", 3 to "D")
    mapList.sortBy { it.first }
    println(mapList) // [(1, A), (2, B), (3, D), (5, C)]
    mapList.sortBy { it.second }
    println(mapList) // [(1, A), (2, B), (5, C), (3, D)]
}      

以上代碼的結果是:

[(1, A), (2, B), (3, D), (5, C)]
[(1, A), (2, B), (5, C), (3, D)]      

同樣,集合需要是可變的,因為sortBy方法将就地排序。如果我們希望将結果作為新清單傳回,那麼我們需要使用sortedBy方法而不是sortBy方法。

像以前一樣,對于降序,我們可以使用sortByDescending或reverse方法。

2.3。SortWith

對于更進階的用法(例如,組合多個規則),我們可以使用sortWith方法。**

我們可以傳遞一個 Comparator對象作為參數。在Kotlin中,我們有多種方法來建立Comparator對象,我們将在下一節中介紹它:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortWith(compareBy({it.second}, {it.first}))
println(sortedValues) // [(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]      

上面代碼的結果是它們按字母排序,然後按數字排序:

[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]      

因為sortWith将就地進行排序,是以我們需要使用可變集合。如果我們想要将結果作為新集合傳回,那麼我們需要使用sortedWith方法而不是sortWith方法。

對于降序,我們可以使用反向方法或者定義正确的 比較器。

3.比較

Kotlin包含一個非常有用的包來建構 Comparator - *kotlin.comparisons。 *在以下部分中,我們将讨論:

  • 比較器建立
  • 處理空值
  • 扭轉訂單
  • 比較器規則擴充

為了簡化Comparator的建立 *, * Kotlin帶來了許多工廠方法,使我們的代碼更具表現力。

最簡單的 Comparator工廠是naturalOrder()。不需要參數,預設情況下順序是升序:

val ascComparator = naturalOrder<Long>()

對于具有多個屬性的對象,我們可以使用compareBy方法。作為參數,我們給出了可變數量的函數(排序規則),每個函數都傳回一個Comparable對象。然後,将按順序調用這些函數,直到生成的Comparable對象計算為不相等或直到調用所有函數。

在下一個例子中,它。第一個值用于比較,并且隻有當值相等時,才會調用it.second來打破平局:

val complexComparator = compareBy<Pair<Int, String?>>({it.first}, {it.second})

随意探索kotlin.comparisons以發現所有可用的工廠。

4。結論

在本快速教程中,我們了解了如何使用sort,sortBy和sortWith方法對Kotlin中的集合進行排序。

之後,我們還使用kotlin.comparisons包來建立Comparator對象,并使用其他排序規則來增強它們。

可以​​在GitHub上​​找到所有這些示例和代碼段的實作。

原文參考:​​https://www.baeldung.com/kotlin-sort​​

Kotlin 開發者社群

國内第一Kotlin 開發者社群公衆号,主要分享、交流 Kotlin 程式設計語言、Spring Boot、Android、React.js/Node.js、函數式程式設計、程式設計思想等相關主題。

繼續閱讀