【Kotlin】レッスン4-05:コレクションを使いこなそう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:コレクション操作

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、関数(レッスン1~3)配列ListSetMapコレクション操作コレクションとジェネリクス

<<前のページ Kotlin記事一覧 次のページ>>

Kotlinの「コレクション操作」とは

この章ではKotlinにおける「コレクション操作」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




Kotlinではデータを効率的に管理するために、配列、List、Set、Mapといったコレクションを使用します。

それぞれの特性を理解し、さらにコレクション操作を活用することで、データの検索、変換、並び替えを簡単に行えるようになります。

コレクションの種類の違い

Kotlinの主要なコレクションである配列、List、Set、Mapには、それぞれ特有の特徴があります。

以下にそれらを表にまとめました。

コレクション 順序性 重複の可否 変更可能性 アクセス方法
配列(Array) 順序あり 重複可 固定長 インデックスでアクセス
List 順序あり 重複可 可変/不変 インデックスでアクセス
Set 順序なし 重複不可 可変/不変 要素の存在を確認 (in演算子など)
Map 順序なし キー重複不可 可変/不変 キーで値を取得

配列 (Array)

配列は固定サイズで、同じ型のデータを連続的に保持します。要素へのアクセスはインデックスを使用します。

val numbers = arrayOf(1, 2, 3)
println(numbers[0]) // 出力: 1

List

順序を保持し、同じ値を複数回保持できます。listOf(読み取り専用)とmutableListOf(変更可能)の2種類があります。

val list = listOf(1, 2, 3)
val mutableList = mutableListOf(1, 2, 3)
mutableList.add(4)

Set

順序を持たず、重複する値を許可しません。setOf(読み取り専用)とmutableSetOf(変更可能)があります。

val set = setOf(1, 2, 3, 1)
println(set) // 出力: [1, 2, 3]

Map

キーと値のペアを保持します。キーはユニークでなければならず、mapOf(読み取り専用)とmutableMapOf(変更可能)があります。

val map = mapOf("key1" to "value1", "key2" to "value2")
println(map["key1"]) // 出力: value1

コレクション操作の基本

Kotlinではコレクションを操作するための便利なメソッドが多く提供されています。

以下は代表的な12個のメソッドです。

  • 検索: first, last, find
  • 集計: count, sum, average
  • 変換: map, flatMap
  • 並び替え: sorted, sortedDescending, sortedBy

これらのメソッドを一つずつ使用例で解説します。

検索: first, last, find

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

// 最初の要素を取得
println(numbers.first()) // 出力: 1

// 最後の要素を取得
println(numbers.last()) // 出力: 5

// 条件に一致する最初の要素を取得
println(numbers.find { it % 2 == 0 }) // 出力: 2

集計: count, sum, average

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

// 偶数の個数を数える
println(numbers.count { it % 2 == 0 }) // 出力: 2

// 全要素の合計を計算
println(numbers.sum()) // 出力: 15

// 平均値を計算
println(numbers.average()) // 出力: 3.0

変換: map, flatMap

val numbers = listOf(1, 2, 3)

// 全要素を2倍に変換する
val doubled = numbers.map { it * 2 }
println(doubled) // 出力: [2, 4, 6]

// 各要素をリストに変換して平坦化
val nestedLists = listOf(listOf(1, 2), listOf(3, 4))
val flatList = nestedLists.flatMap { it }
println(flatList) // 出力: [1, 2, 3, 4]

並び替え: sorted, sortedDescending, sortedBy

val numbers = listOf(5, 2, 8, 1)

// 昇順に並び替え
println(numbers.sorted()) // 出力: [1, 2, 5, 8]

// 降順に並び替え
println(numbers.sortedDescending()) // 出力: [8, 5, 2, 1]

// カスタム条件で並び替え
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 30), Person("Bob", 25))
println(people.sortedBy { it.age }) // 出力: [Person(name=Bob, age=25), Person(name=Alice, age=30)]

コレクション操作を使うメリット

コレクション操作を使うと、コードを簡潔に保ちながら強力なデータ操作が可能になります。

またラムダ式などと組み合わせることで、複雑なデータ処理も短いコードで表現できます。

またデータの検索、変換、並び替えが直感的に行えるため、プログラム全体の読みやすさも向上します。

まとめ

Kotlinのコレクション操作は、日常的なデータ処理を効率化するための強力なツールです。

それぞれのコレクションの違いを理解し、適切な操作を選択することで、初心者でも効率的にデータを扱うことができるようになります。

コレクション操作の練習問題:リストを使って並べ替えや検索をしてみよう

リストを使ったデータ操作を練習するプログラムを作成しましょう。

このプログラムでは定義されたリストの中から要素を検索したり、リスト全体の並び替えや変換を行います。

また合計や平均といった集計操作も学ぶことができます。プログラムの結果を画面に出力しながら、コレクション操作を理解しましょう。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. リスト numbers を5つの整数で定義すること。
  2. リストの最初の要素と最後の要素を表示すること。
  3. リストの中から最初に見つかった偶数を検索し、その値を表示すること。
  4. リストの全要素の合計、平均、要素数をそれぞれ計算して表示すること。
  5. リストの全要素を2倍に変換した新しいリストを作成し、その結果を表示すること。
  6. リストを昇順と降順に並び替えた結果をそれぞれ表示すること。
  7. リストの中から奇数の要素だけを抽出し、その結果を表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

元のリスト: [5, 3, 8, 2, 9]
最初の数値: 5
最後の数値: 9
最初に見つかった偶数: 8
数値の合計: 27
数値の平均: 5.4
要素の数: 5
全ての数値を2倍にしたリスト: [10, 6, 16, 4, 18]
昇順に並び替えたリスト: [2, 3, 5, 8, 9]
降順に並び替えたリスト: [9, 8, 5, 3, 2]
奇数のみのリスト: [5, 3, 9]

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:メイン関数の定義
  □ 変数numbersにlistOfで直接リストを定義
  □ 「元のリスト: $numbers」と出力
  □ 「最初の数値: ${numbers.first()}」と出力
  □ 「最後の数値: ${numbers.last()}」と出力
  □ 変数firstEvenにnumbersから偶数の中で最初に見つかった値をfindで代入
  □ 「最初に見つかった偶数: ${firstEven ?: “なし”}」と出力
  □ 「数値の合計: ${numbers.sum()}」と出力
  □ 「数値の平均: ${numbers.average()}」と出力
  □ 「要素の数: ${numbers.count()}」と出力
  □ 変数doubledNumbersにnumbersの各要素を2倍にしたリストをmapで代入
  □ 「全ての数値を2倍にしたリスト: $doubledNumbers」と出力
  □ 「昇順に並び替えたリスト: ${numbers.sorted()}」と出力
  □ 「降順に並び替えたリスト: ${numbers.sortedDescending()}」と出力
  □ 変数oddNumbersにnumbersの奇数要素をfilterで抽出して代入
  □ 「奇数のみのリスト: $oddNumbers」と出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

// メイン関数:プログラムのエントリーポイント
fun main() {
    // リストを直接定義
    val numbers = listOf(5, 3, 8, 2, 9)

    // コレクション操作の例
    println("元のリスト: $numbers") // 元のリストを表示

    // 1. 検索: 最初と最後の要素を表示
    println("最初の数値: ${numbers.first()}") // 最初の要素
    println("最後の数値: ${numbers.last()}") // 最後の要素

    // 2. 条件付き検索: 偶数の中で最初に見つかった値
    /*【穴埋め問題1】
    ここでnumbersから偶数の中で最初に見つかった値を取得し、変数firstEvenに代入するコードを書いてください。
    */

    println("最初に見つかった偶数: ${firstEven ?: "なし"}") // 条件に一致しない場合は"なし"

    // 3. 集計: 合計、平均、要素数
    /*【穴埋め問題2】
    ここでnumbersの合計を取得し、「数値の合計: 」に続けて出力するコードを書いてください。
    */
    /*【穴埋め問題3】
    ここでnumbersの平均を取得し、「数値の平均: 」に続けて出力するコードを書いてください。
    */
    /*【穴埋め問題4】
    ここでnumbersの要素数を取得し、「要素の数: 」に続けて出力するコードを書いてください。
    */

    // 4. 変換: 全要素を2倍にする
    /*【穴埋め問題5】
    ここでnumbersの全要素を2倍に変換したリストを作成し、変数doubledNumbersに代入するコードを書いてください。
    */
    println("全ての数値を2倍にしたリスト: $doubledNumbers")

    // 5. 並び替え: 昇順と降順
    /*【穴埋め問題6】
    ここでnumbersを昇順に並び替えたリストを取得し、「昇順に並び替えたリスト: 」に続けて出力するコードを書いてください。
    */
    /*【穴埋め問題7】
    ここでnumbersを降順に並び替えたリストを取得し、「降順に並び替えたリスト: 」に続けて出力するコードを書いてください。
    */

    // 6. 条件フィルタリング: 奇数だけを抽出
    /*【穴埋め問題8】
    ここでnumbersから奇数のみを抽出したリストを作成し、変数oddNumbersに代入するコードを書いてください。
    */
    println("奇数のみのリスト: $oddNumbers")
}

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

// メイン関数:プログラムのエントリーポイント
fun main() {
    // リストを直接定義
    val numbers = listOf(5, 3, 8, 2, 9)

    // コレクション操作の例
    println("元のリスト: $numbers") // 元のリストを表示

    // 1. 検索: 最初と最後の要素を表示
    println("最初の数値: ${numbers.first()}") // 最初の要素
    println("最後の数値: ${numbers.last()}") // 最後の要素

    // 2. 条件付き検索: 偶数の中で最初に見つかった値
    val firstEven = numbers.find { it % 2 == 0 }
    println("最初に見つかった偶数: ${firstEven ?: "なし"}") // 条件に一致しない場合は"なし"

    // 3. 集計: 合計、平均、要素数
    println("数値の合計: ${numbers.sum()}") // 合計
    println("数値の平均: ${numbers.average()}") // 平均
    println("要素の数: ${numbers.count()}") // 要素数

    // 4. 変換: 全要素を2倍にする
    val doubledNumbers = numbers.map { it * 2 }
    println("全ての数値を2倍にしたリスト: $doubledNumbers")

    // 5. 並び替え: 昇順と降順
    println("昇順に並び替えたリスト: ${numbers.sorted()}") // 昇順
    println("降順に並び替えたリスト: ${numbers.sortedDescending()}") // 降順

    // 6. 条件フィルタリング: 奇数だけを抽出
    val oddNumbers = numbers.filter { it % 2 != 0 }
    println("奇数のみのリスト: $oddNumbers")
}

正解コードの解説

このコードではKotlinでのコレクション操作を学ぶため、リストを使った検索、並び替え、集計、変換の基本を実践します。

各機能の詳細をコードブロックごとに解説します。

リストの定義と初期化

val numbers = listOf(5, 3, 8, 2, 9)
  • listOf: Kotlinで読み取り専用リストを作成するための関数です。
  • この行でnumbersという名前のリストが初期化され、5つの整数要素が格納されます。

最初と最後の要素を取得

println("最初の数値: ${numbers.first()}")
println("最後の数値: ${numbers.last()}")
  • first()last()はそれぞれリストの最初と最後の要素を取得します。
  • 結果を画面に出力することで、リストの基本的なアクセス方法を確認できます。

条件付き検索

val firstEven = numbers.find { it % 2 == 0 }
println("最初に見つかった偶数: ${firstEven ?: "なし"}")
  • find: 条件に一致する最初の要素を返す関数です。
  • { it % 2 == 0 }: 各要素itが偶数かどうかを確認する条件です。
  • ?: "なし": 条件に一致する要素がない場合に”なし”と表示するためのエルビス演算子です。

集計操作

println("数値の合計: ${numbers.sum()}")
println("数値の平均: ${numbers.average()}")
println("要素の数: ${numbers.count()}")
  • sum(): リスト内の全要素を合計します。
  • average(): リスト内の全要素の平均を計算します。
  • count(): リスト内の要素数をカウントします。

リストの変換

val doubledNumbers = numbers.map { it * 2 }
println("全ての数値を2倍にしたリスト: $doubledNumbers")
  • map: リスト内の各要素を変換する関数です。
  • { it * 2 }: 各要素itを2倍にするラムダ式です。
  • 新しいリストdoubledNumbersに変換後の要素が格納されます。

並び替え

println("昇順に並び替えたリスト: ${numbers.sorted()}")
println("降順に並び替えたリスト: ${numbers.sortedDescending()}")
  • sorted(): 昇順にリストを並び替えます。
  • sortedDescending(): 降順にリストを並び替えます。

条件によるフィルタリング

val oddNumbers = numbers.filter { it % 2 != 0 }
println("奇数のみのリスト: $oddNumbers")
  • filter: 条件に一致する要素を抽出する関数です。
  • { it % 2 != 0 }: 各要素itが奇数かどうかを確認するラムダ式です。

まとめ

このコードはKotlinのコレクション操作の基礎を学ぶために最適です。

各操作が簡潔に書けるKotlinの利便性を体感しながら、リストの基本操作(検索、集計、変換、並び替え、フィルタリング)を学べます。

繰り返し実践して、自分のデータ操作スキルを高めていきましょう!

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Kotlinのテキスト&問題集トップへ戻る
    トップページへ戻る