Skip to content

分組

Kotlin 標準函式庫提供了用於分組集合元素的擴充函式。 基本函式 groupBy() 接受一個 Lambda 函式並傳回一個 Map。在此 Map 中,每個鍵是 Lambda 的結果,而對應的值是傳回該結果之元素的 List。例如,可以使用此函式依首字母對 String 清單進行分組。

你也可以呼叫帶有第二個 Lambda 引數(即值轉換函式)的 groupBy()。 在使用兩個 Lambda 的 groupBy() 結果 Map 中,由 keySelector 函式產生的鍵會對應到值轉換函式的結果,而不是原始元素。

此範例說明了如何使用 groupBy() 函式依首字母對字串進行分組,使用 for 運算子遍歷結果 Map 中的群組,然後使用 valueTransform 函式將值轉換為大寫:

kotlin
fun main() {
    val numbers = listOf("one", "two", "three", "four", "five")

    // 使用 groupBy() 依首字母對字串進行分組
    val groupedByFirstLetter = numbers.groupBy { it.first().uppercase() }
    println(groupedByFirstLetter)
    // {O=[one], T=[two, three], F=[four, five]}

    // 遍歷每個群組並列印鍵及其關聯的值
    for ((key, value) in groupedByFirstLetter) {
        println("Key: $key, Values: $value")
    }
    // Key: O, Values: [one]
    // Key: T, Values: [two, three]
    // Key: F, Values: [four, five]

    // 依首字母對字串進行分組,並將值轉換為大寫
    val groupedAndTransformed = numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.uppercase() })
    println(groupedAndTransformed)
    // {o=[ONE], t=[TWO, THREE], f=[FOUR, FIVE]}
}

如果你想對元素進行分組,然後一次對所有群組套用操作,請使用函式 groupingBy()。 它會傳回 Grouping 型別的執行個體。Grouping 執行個體讓你能夠以延遲方式對所有群組套用操作:群組實際上是在操作執行前才建立的。

具體來說,Grouping 支援以下操作:

  • eachCount() 計算每個群組中的元素數量。
  • fold()reduce() 在每個群組上作為獨立集合執行 fold 與 reduce 操作,並傳回結果。
  • aggregate() 將指定操作隨後套用到每個群組中的所有元素並傳回結果。 這是對 Grouping 執行任何操作的通用方式。當 fold 或 reduce 不足以滿足需求時,可使用它來實作自訂操作。

你可以在結果 Map 上使用 for 運算子遍歷由 groupingBy() 函式建立的群組。這讓你能夠存取每個鍵以及與該鍵關聯的元素數量。

以下範例示範如何使用 groupingBy() 函式依首字母對字串進行分組、計算每個群組中的元素數量,然後遍歷每個群組以列印鍵和元素數量:

kotlin
fun main() {
    val numbers = listOf("one", "two", "three", "four", "five")

    // 使用 groupingBy() 依首字母對字串進行分組,並計算每個群組中的元素數量
    val grouped = numbers.groupingBy { it.first() }.eachCount()

    // 遍歷每個群組並列印鍵及其關聯的值
    for ((key, count) in grouped) {
        println("Key: $key, Count: $count")
        // Key: o, Count: 1
        // Key: t, Count: 2
        // Key: f, Count: 2
    }
}