Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. リスト — groupBy() / partition()

リスト — groupBy() / partition()

Kotlinの『groupBy()』はキーセレクターでリストをグループ分けしてMap形式で返します。『partition()』は条件でリストを2つに分割します。データの分類・振り分け処理に使います。

構文
val numbers = listOf(1, 2, 3, 4, 5, 6)

// groupBy — キーでグループ化します。
val grouped = numbers.groupBy { if (it % 2 == 0) "偶数" else "奇数" }
// {"奇数": [1, 3, 5], "偶数": [2, 4, 6]}

// partition — 条件で2つのリストに分割します。
val (evens, odds) = numbers.partition { it % 2 == 0 }
// evens: [2, 4, 6], odds: [1, 3, 5]
メソッド一覧
メソッド概要
リスト.groupBy { キー }キーセレクターで要素をグループ化した Map<K, List<T>> を返します。
リスト.groupBy({ キー }, { 値変換 })キーと値変換を指定してグループ化します。
リスト.groupingBy { キー }.eachCount()グループごとの件数を Map<K, Int> で返します。
リスト.partition { 条件 }条件を満たす要素と満たさない要素の Pair<List, List> を返します。
リスト.chunked(n)n 個ずつのサブリストに分割します。
リスト.windowed(n)n 個のスライドウィンドウでサブリストを生成します。
サンプルコード
data class Student(val name: String, val grade: String, val score: Int)

fun main() {
    val students = listOf(
        Student("Alice", "A", 95),
        Student("Bob", "B", 75),
        Student("Carol", "A", 88),
        Student("Dave", "C", 62),
        Student("Eve", "B", 80),
        Student("Frank", "C", 58)
    )

    // groupBy — 学年でグループ化します。
    val byGrade = students.groupBy { it.grade }
    println("=== 学年別 ===")
    byGrade.forEach { (grade, list) ->
        val names = list.map { it.name }
        println("$grade: $names")
    }

    // 値変換付き groupBy(名前だけグループ化)
    val namesByGrade = students.groupBy({ it.grade }, { it.name })
    println("\n学年→名前: $namesByGrade")

    // グループごとの件数
    val countByGrade = students.groupingBy { it.grade }.eachCount()
    println("件数: $countByGrade")

    println()

    // partition — 合格(70点以上)と不合格で分割します。
    val (passed, failed) = students.partition { it.score >= 70 }
    println("=== 合否 ===")
    println("合格: ${passed.map { it.name }}")
    println("不合格: ${failed.map { it.name }}")

    println()

    // chunked — バッチ処理に使います(3件ずつ)
    val chunks = students.chunked(3)
    println("=== バッチ処理 ===")
    chunks.forEachIndexed { i, batch ->
        println("バッチ $i: ${batch.map { it.name }}")
    }

    println()

    // windowed — 移動平均などに使います(3件のスライドウィンドウ)
    val scores = students.map { it.score }
    val windows = scores.windowed(3)
    println("=== 3点移動平均 ===")
    windows.forEach { w ->
        println("$w → 平均: ${"%.1f".format(w.average())}")
    }
}
概要

『groupBy()』はSQLの『GROUP BY』に相当します。返値は『Map<K, List<T>>』なので、各グループに対してさらに集計(『map { it.value.size }』など)が可能です。

『partition()』は2つのグループに分けるシンプルな操作で、分割宣言(『val (a, b) = ...』)を使うとスッキリ書けます。3つ以上に分けたい場合は『groupBy()』を使います。

畳み込み・集計はリスト — reduce() / fold()を、平坦化はリスト — flatMap() / flatten()を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。