【Kotlin】レッスン4-2:Listを理解しよう|mutableListとlistOfの違いと操作を学ぶ

ながみえ

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

今回は List について見ていきましょう。

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とは何か?|基本構文から応用操作まで解説

データを順序付けて管理する方法は、「配列(Array)」のほかに「List」があります。

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

  • 配列:一度定義したら要素の数を変更できない順序付きデータ
  • リスト:要素数を後から変更可能な順序付きデータ

Listの概要と配列との違い

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

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

特に イミュータブルリスト(要素変更不可リスト)ミュータブルリスト(要素変更可能リスト)の2種類があり、多くの場合で配列より使いやすい選択肢となります。

2種類のリストと配列との違いは以下の表の通りです。

比較要素ImmutableListmutableList配列(Array)
サイズ(要素数)変更不可可能不可
要素の変更不可可能可能
サイズ変更不可可能不可

Immutable List と mutable List の作成

2種類のリストを作成するには、それぞれ専用の関数を使用する必要があります。

Immutable Listの作成|要素を変更できないリスト

要素の変更を許さないイミュータブルリストを作成するには listOf()関数 を使用します。

ImmutableListは、一度作成すると要素の追加・削除・変更変更することができません。

val immutableList = listOf("Apple", "Banana", "Cherry")	// イミュータブルリストの定義
immutableList[0] = "りんご"							 // 要素を変更しようとするとエラーになる

Mutable Listの作成|要素を変更できるリスト

後からでも要素の変更が可能なミュータブルリストを作成するには mutableListOf()関数 を使います。

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

val mutableList = mutableListOf("Apple", "Banana")	// ミュータブルリストの定義
mutableList.add("Cherry")	// リストにCherryを追加
mutableList.remove("Apple")	// リストからAppleを削除

Immutable List と mutable List を操作しよう

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

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

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

具体的なコードを見ていきましょう。

要素へのアクセス|インデックス指定とメソッドによる操作

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

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

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

add()メソッドやremoveメソッドで要素数の数を変更できるのがミュータブルリストの特徴です。

Immutable Listの情報を取得する方法

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

val fruits = listOf("Apple", "Banana", "Cherry")
println("リストのサイズ: ${fruits.size}")					  // リストの要素数を取得
println("バナナは含まれるか: ${fruits.contains("Banana")}")	// 特定の要素が含まれているか確認
  • .sizeプロパティはリストのサイズ(要素の個数)を取得します。この場合、結果は3です。
  • .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]になります。

ラムダ式によるListの柔軟な操作方法

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

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

Q
ヒント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をキャッチし、エラーメッセージを出力

Q
ヒント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}") // エラーをキャッチして表示
    }
}

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

この問題の解答と解説

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

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

Q
正解コード
// メイン関数:プログラムのエントリポイント
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}") // エラーをキャッチして表示
    }
}
Q
正解コードの解説

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

リストの作成と初期化

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が発生します。このエラーをキャッチして、適切なメッセージを表示します。
Q
サイト改善アンケート & ご指摘/ご質問

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

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

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

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました