【Kotlin】レッスン4-5:コレクション操作を極めよう|検索・変換・並び替えの基本

ながみえ

一つ前のページではMapについて学習しました。

今回は コレクション操作 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編
Lesson4:コレクション編

 ・Lesson4-1:配列を理解しよう
 ・Lesson4-2:Listを理解しよう
 ・Lesson4-3:Setを理解しよう
 ・Lesson4-4:Mapを理解しよう
 ・Lesson4-5:コレクションを使いこなそう ◁今回はココ
 ・Lesson4-6:コレクションとジェネリクスを組み合わせよう
 ・確認問題4-☆1:ナインゲームを作ろう
 ・確認問題4-☆2:アラビア数字をローマ数字に変換しよう
 ・確認問題4-☆3:宝探しゲームを作ろう
Lesson5:オブジェクト指向編

<<前のページ

学習記事一覧

次のページ>>

コレクション操作とは?|配列・List・Set・Mapを自在に扱おう

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

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

配列・List・Set・Mapの違いを理解しよう|使い分けのポイント

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

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

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

配列 (Array)の特徴と書き方

配列は固定サイズで、同じ型のデータを連続的に保持します。

要素へのアクセスはインデックスを使用します。

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

Listの特徴と書き方

Listは順序を保持し、同じ値を複数回保持できます。

listOf(読み取り専用)とmutableListOf(変更可能)の2種類があります。

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

Set(集合)の特徴と書き方

Setは順序を持たず、重複する値を許可しません。

setOf(読み取り専用)とmutableSetOf(変更可能)があります。

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

Mapの特徴と書き方

Mapはキーと値のペアを保持します。

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

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

主要なコレクション操作|map・filter・sortedなど

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

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

  • 検索firstlastfind
  • 集計countsumaverage
  • 変換mapflatMap
  • 並び替えsortedsortedDescendingsortedBy

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

要素の検索: 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)]

まとめ|コレクション操作でデータ処理を効率化しよう

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

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

それぞれのコレクションの違いを理解し、適切な操作を選択して、効率的にデータを扱えるようになりましょう。

練習問題|リストの検索・変換・並び替えコードを実装しよう

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

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

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

この問題の要件

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

  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からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント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」と出力

Q
ヒント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")
}

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

この問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
// メイン関数:プログラムのエントリーポイント
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")
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

リストの定義と初期化

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が奇数かどうかを確認するラムダ式です。
Q
サイト改善アンケート & ご指摘/ご質問

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。

また記事の内容に関する ご指摘ご質問 もお待ちしています。

1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
※ 特定の記事に関する内容の場合は、記事番号(レッスン〇-〇)をご記入願います。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました