【Kotlin】レッスン4-02:Listを理解しよう

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

この記事で学べる知識:List

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

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

Kotlinの「List」とは

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




Kotlinではデータを順序付けて管理する方法として「配列(Array)」と「List」があります。

配列は固定サイズで要素を保持しますが、Listは柔軟性が高く、いつでもサイズを変更できます。

特にImmutable List(要素変更不可)とMutable List(要素変更可能)の2種類があり、多くの場合で配列より使いやすい選択肢となります。

Listとは?

Listは順序付きの要素を管理するデータ構造です。

要素はインデックス(0から始まる番号)で管理され、同じ値を複数回含むことも可能です。

Kotlinでは、後から要素を変更不可能なListと変更可能なListがあり、それぞれlistOfmutableListOfで作成できます。

Immutable List

変更不可能なListは、一度作成するとその中身を変更することができません。

val immutableList = listOf("Apple", "Banana", "Cherry")

Mutable List

変更可能なListは、作成後に要素を追加・削除・更新することが可能です。

val mutableList = mutableListOf("Apple", "Banana")
mutableList.add("Cherry")    // リストにCherryを追加
mutableList.remove("Apple")  // リストからAppleを削除

また、Kotlinでは宣言したリストは以下のような操作が可能です。

  • 要素の追加: add
  • 要素の削除: remove, removeAt
  • 要素の検索: contains, indexOf
  • サイズ取得: size
  • 条件でフィルタリング: filter
  • 要素の変換: map

これらを適切に使い分けることで、Listのデータ操作が簡単かつ柔軟になります。

それぞれの使い方についても見ていきましょう。

リストの基本構文

Listを作成し、操作するための基本構文を紹介します。

Listの作成

リストはlistOf()やmutableListOf()を使って宣言します。

val fruits = listOf("Apple", "Banana", "Cherry") // 要素変更不可のfruitsリストの宣言
val numbers = mutableListOf(1, 2, 3)             // 要素変更可能なnumbersリストの宣言

要素へのアクセス

Listの要素はインデックスを指定してアクセスします。

val firstFruit = fruits[0]     // fruitsリストのインデックス0を定数firstFruitに代入
numbers.add(4) // [1, 2, 3, 4] // numbersリストに4を追加
numbers[ 1] = 5 // [1, 5, 3, 4] // numbersリストのインデックス1を取り出し
numbers.remove(3) // [1, 5, 4] // numbersリストから3を削除

リストの使用例

以下は、KotlinのListを使用した実例です。

Immutable Listの使用

以下は、Immutable Listを使って果物のリストを作成し、情報を取得するコードです。

val fruits = listOf("Apple", "Banana", "Cherry")
println("リストのサイズ: ${fruits.size}")       // リストの要素数を取得
println("バナナは含まれるか: ${fruits.contains("Banana")}") // 特定の要素が含まれているか確認
  • fruits.sizeはリストのサイズ(要素の個数)を取得します。この場合、結果は3です。
  • fruits.contains("Banana")はリストに”Banana”が含まれているかを判定します。結果はtrueになります。

Mutable Listの使用例

次はMutable Listを使って数値リストを操作する例です。

val numbers = mutableListOf(10, 20, 30)
numbers.add(40) // 要素40をリストに追加
println("追加後のリスト: $numbers") // 結果: [10, 20, 30, 40]

numbers.removeAt(1) // インデックス1の要素(20)を削除
println("削除後のリスト: $numbers") // 結果: [10, 30, 40]
  • numbers.add(40)はリストの末尾に新しい要素40を追加します。
  • numbers.removeAt(1)は指定されたインデックス(この場合は1)にある要素を削除します。削除後、リストの内容は[10, 30, 40]になります。

現実的なシナリオ

以下の例は学生の点数リストから合格者だけを抽出するコードです。

val scores = listOf(55, 70, 85, 40, 90)
val passingScores = scores.filter { it >= 60 } // 合格点(60点以上)のみを抽出
println("合格者の点数: $passingScores") // 結果: [70, 85, 90]
  • filter関数を使用して、条件(点数が60以上)に合致する要素だけを新しいリストに抽出しています。
  • このコードは試験結果を処理して合格者の点数リストを作成する場合に役立ちます。

ラムダ式を使った操作

ラムダ式とは、名前のない簡易的な関数を作成するための方法です。

Kotlinでは{ 引数 -> 処理 }の形式で記述します。引数が1つの場合は省略してitで参照することができます。

val double = { x: Int -> x * 2 } //引数xを受け取り2倍にするdouble関数を定義
println(double(3)) // 6

このラムダ式を使うことで、Listの操作をさらに簡単に行うことができます。

条件に合う要素を抽出する(filter

val scores = listOf(55, 70, 85, 40, 90)
val passingScores = scores.filter { it >= 60 } // 条件に合う要素を抽出
println(passingScores) // [70, 85, 90]

filterはリスト内の要素を条件で選別し、新しいリストを作成します。

要素を変換する(map

val numbers = listOf(1, 2, 3)
val doubled = numbers.map { it * 2 } //リストの各要素を2倍する関数
println(doubled) // [2, 4, 6]

mapは、リスト内の各要素に処理を適用し、新しいリストを作成します。

要素を集計する

val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.sum() // 合計を計算
println(sum) // 15

sumはリスト内の数値の合計を計算します。

まとめ

この記事ではKotlinのListとその操作方法について解説しました。

  • Immutable ListとMutable Listの違い
  • 基本的な操作(追加、削除、検索)
  • ラムダ式を使った高度な操作(filter, map, sumなど)

Listの柔軟な使い方を理解し、プログラムの効率を向上させましょう!

Listの練習問題:リスト操作してデータを管理しよう

果物リストを管理するプログラムを作成し、KotlinのList操作を勉強しましょう。

このプログラムではリストに要素を追加したり削除したり、特定の要素が含まれているかを確認します。

この問題の要件

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

  • 可変リストfruitsを作成し、初期値として「りんご」「バナナ」「オレンジ」を追加すること。
  • リストの内容を画面に表示すること。
  • リストに「ぶどう」を追加し、追加後のリストを表示すること。
  • リストから「バナナ」を削除し、削除後のリストを表示すること。
  • リストに「りんご」が含まれているか確認し、その結果を表示すること。
  • forループを使用して、リスト内の各要素を順番に表示すること。
  • null安全性を用いて、リストがnullまたは空の場合にメッセージを表示すること。
  • 存在しないインデックスをアクセスしようとした場合、例外をキャッチしてエラーメッセージを表示すること。(IndexOutOfBoundsExceptionエラー)

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

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

最初のリストの内容: [りんご, バナナ, オレンジ]
要素追加後のリスト: [りんご, バナナ, オレンジ, ぶどう]
要素削除後のリスト: [りんご, オレンジ, ぶどう]
リストに「りんご」は: 含まれています
リストの要素を一つずつ表示:
りんご
オレンジ
ぶどう
リストがnullの場合の例:
リストは空またはnullです
エラー: Index 10 out of bounds for length 3

この問題を解くヒント

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

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

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

1:main関数の定義
  □ mutableListOfを使用して、文字列のリストfruitsを初期化
  □ printlnでfruitsの内容を出力
  □ addメソッドでfruitsに新しい要素「ぶどう」を追加
  □ printlnで更新後のfruitsの内容を出力
  □ removeメソッドでfruitsから「バナナ」を削除
  □ printlnで要素削除後のfruitsの内容を出力
  □ if文を使用してfruitsに「りんご」が含まれているか判定し、結果を変数isContainsAppleに代入
  □ printlnでisContainsAppleの内容を出力
  □ printlnでリストの内容を一つずつ表示することを示すメッセージを出力
  □ for文を使用してfruits内の要素を一つずつ出力
  □ nullableなリストnullableListを定義し、nullで初期化
  □ isNullOrEmptyメソッドでnullableListが空またはnullかを判定
  □ if文の条件が真の場合、リストが空またはnullである旨を出力
  □ tryブロックを使用して、インデックス範囲外の要素を参照するコードを実行
  □ catchブロックでIndexOutOfBoundsExceptionをキャッチし、エラーメッセージを出力

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

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

// メイン関数:プログラムのエントリポイント
fun main() {
    // Mutable Listを作成(変更可能なリスト)
    /*【穴埋め問題1】
    ここにmutableListOfを使用してリストfruitsを作成し、"りんご", "バナナ", "オレンジ"を初期値として含めるコードを書いてください。
    */

    // リストの内容を表示
    println("最初のリストの内容: $fruits")

    // 要素を追加
    /*【穴埋め問題2】
    ここにリストfruitsに"ぶどう"を追加するコードを書いてください。
    */
    println("要素追加後のリスト: $fruits")

    // 要素を削除
    /*【穴埋め問題3】
    ここにリストfruitsから"バナナ"を削除するコードを書いてください。
    */
    println("要素削除後のリスト: $fruits")

    // リスト内の要素を検索
    val isContainsApple = if ("りんご" in fruits) "含まれています" else "含まれていません"
    println("リストに「りんご」は: $isContainsApple")

    // 繰り返し処理でリストを出力
    println("リストの要素を一つずつ表示:")
    for (fruit in fruits) {
        println(fruit) // 各要素を出力
    }

    // null安全性を利用した操作例
    val nullableList: List<String>? = null
    println("リストがnullの場合の例:")
    if (nullableList.isNullOrEmpty()) {
        println("リストは空またはnullです")
    }

    // 例外処理を用いて不正な操作を防止
    try {
        println("インデックス外の要素: ${fruits[10]}") // 存在しない要素をアクセス
    } catch (e: IndexOutOfBoundsException) {
        println("エラー: ${e.message}") // エラーをキャッチして表示
    }
}

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

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



練習問題の解答と解説

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

正解コードの例

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

// メイン関数:プログラムのエントリポイント
fun main() {
    // Mutable Listを作成(変更可能なリスト)
    val fruits = mutableListOf("りんご", "バナナ", "オレンジ")
    
    // リストの内容を表示
    println("最初のリストの内容: $fruits")
    
    // 要素を追加
    fruits.add("ぶどう") // リストに「ぶどう」を追加
    println("要素追加後のリスト: $fruits")
    
    // 要素を削除
    fruits.remove("バナナ") // リストから「バナナ」を削除
    println("要素削除後のリスト: $fruits")
    
    // リスト内の要素を検索
    val isContainsApple = if ("りんご" in fruits) "含まれています" else "含まれていません"
    println("リストに「りんご」は: $isContainsApple")
    
    // 繰り返し処理でリストを出力
    println("リストの要素を一つずつ表示:")
    for (fruit in fruits) {
        println(fruit) // 各要素を出力
    }
    
    // null安全性を利用した操作例
    val nullableList: List<String>? = null
    println("リストがnullの場合の例:")
    if (nullableList.isNullOrEmpty()) {
        println("リストは空またはnullです")
    }
    
    // 例外処理を用いて不正な操作を防止
    try {
        println("インデックス外の要素: ${fruits[10]}") // 存在しない要素をアクセス
    } catch (e: IndexOutOfBoundsException) {
        println("エラー: ${e.message}") // エラーをキャッチして表示
    }
}

正解コードの解説

今回のプログラムはKotlinのListを使った基本的な操作を学ぶためのものです。

以下ではコードをブロックごとに分割し、詳細に解説します。

リストの作成と初期化

val fruits = mutableListOf("りんご", "バナナ", "オレンジ")
  • mutableListOf: KotlinのListには変更可能なMutableListと、変更不可能な通常のListがあります。ここではmutableListOfを使用して初期値として3つの果物を格納するリストを作成しています。
  • このリストは後で要素を追加・削除することができます。

リストの内容を表示

println("最初のリストの内容: $fruits")

Kotlinでは文字列テンプレート(${})を使うことで、リストの内容を簡単に表示することができます。

fruitsリストの現在の内容が出力されます。

リストへの要素追加

fruits.add("ぶどう")
println("要素追加後のリスト: $fruits")
  • add: MutableListに新しい要素を追加するメソッドです。ここでは「ぶどう」をリストに追加しています。
  • printlnを使って追加後のリスト内容を確認しています。

リストからの要素削除

fruits.remove("バナナ")
println("要素削除後のリスト: $fruits")
  • remove: 指定した要素をリストから削除します。この例では「バナナ」を削除しています。
  • 指定した要素がリストに存在しない場合は、削除は行われません。

要素の検索

val isContainsApple = if ("りんご" in fruits) "含まれています" else "含まれていません"
println("リストに「りんご」は: $isContainsApple")
  • in演算子を使用して、特定の要素がリストに含まれているかを確認しています。
  • if文を使って条件に応じたメッセージを表示しています。

リストの各要素を順に表示

for (fruit in fruits) {
    println(fruit)
}
  • forループ: リスト内の各要素を順番に処理するための構文です。
  • fruitにはリストの各要素が1つずつ代入され、printlnで出力されています。

Null安全性の活用

val nullableList: List<String>? = null
if (nullableList.isNullOrEmpty()) {
    println("リストは空またはnullです")
}
  • null安全性: ?を使用してnullを許容する変数を定義できます。
  • isNullOrEmpty: リストがnullまたは空の場合にtrueを返します。この条件に基づいてメッセージを表示しています。

例外処理

try {
    println("インデックス外の要素: ${fruits[10]}")
} catch (e: IndexOutOfBoundsException) {
    println("エラー: ${e.message}")
}
  • try-catch: エラーが発生する可能性のあるコードを安全に実行するための構文です。
  • fruits[10]は存在しないインデックスを指定しており、IndexOutOfBoundsExceptionが発生します。このエラーをキャッチして、適切なメッセージを表示します。

まとめ

このコードを通じてKotlinのListの基本的な操作を学びました。

  • リストの作成、要素の追加・削除
  • 要素の検索や繰り返し処理
  • null安全性や例外処理の活用

Listはデータの管理や操作に非常に便利な構造です。これらの基本をしっかりと理解し、実際のプログラムで活用してみましょう!

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

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

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

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






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