【第13章】Listとは?ListとMutableListについて詳しく解説

【第13章】リストとミュータブルリストについて詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、KotlinでのListとMutableListについて詳しく勉強するピヨ!

この第13章では、プログラミング言語であるKotlinのListとMutableListについて、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのListとMutableListについて1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。

スポンサーリンク

【Kotlin】List(リスト)とは?

List(リスト)とは?

Kotlinの「List」とは、どういった時に使う処理なんでしょうか?まずは、Listがどういった処理を行うものなのかを勉強していきましょう。

Arrayと同じで、変数をまとめて管理する

基本的にListはArrayと使い方が同じで、様々な変数をまとめて管理するために使います。

Int型やDouble型など、同じタイプの変数をまとめて管理する時に「リスト」という仕組みを利用します。

Arrayについても勉強したい方は、以下の記事も参考にしてください。

定義の仕方はArrayと異なる

使い勝手は同じListとArrayですが、記述の仕方は当然変わってきます。Listの記述の仕方は以下で見ていきましょう。

リンコ
リンコ

Listの使い方は、Arrayと同じで変数をまとめて管理するために使うピヨ!

【Kotlin】Listの使い方

Listの使い方

では実際にListの使い方、記述の仕方を勉強していきましょう。ここでのListは、Int型を使って説明していきます。

Listの書式

Listを使う場合の書式は以下になります。Listの記述も基本の記述の仕方がありますが、省略もできるので両方の書式を載せておきます。

// 通常のリストの書式
val リスト名: List<型名> = listOf(値1,値2,値3...)
// 省略したリストの書式
val リスト名 = listOf(値1,値2,値3...)

上記がリストの書式になり、このようにリストでも「: List<型名>」の部分を省略することもできます。

また配列では「型名ArrayOf」と型によって変えなければいけませんでしたが、リストではどの型でも「listOf」でいいので、間違える心配がありません。

リンコ
リンコ

リストの定義はすべて「listOf」で良いピヨ!

Listを使ったコードを記述してみよう

では実際にリストを使ったコードを記述してみましょう。

サンプルコード

以下のサンプルコードでは、3人分の給料をmoneyというリストに格納し、その後println関数で出力しています。

// リスト「money」に3人分の給料を格納
val money = listOf(200000,210000,220000)
// インデックス番号を指定して値を参照
println("1人目の給料は${money[0]}円です。")
println("2人目の給料は${money[1]}円です。")
println("3人目の給料は${money[2]}円です。")

出力

サンプルコードを実行すると、以下のように出力されます。

1人目の給料は200000円です。
2人目の給料は210000円です。
3人目の給料は220000円です。

このようにリストは、Int型の整数であれば整数をまとめて管理し、インデックス番号を指定して値を取り出すことができます。

第12章を読んで頂けた方ならわかると思いますが、配列とほとんど一緒ですよね?ということで、以下からはリストと配列は具体的に何が違うのか学んでいきましょう。

【Kotlin】ListとArrayの違いについて

ListとArrayの違いについて

ここでは、使い方が同じのリストと配列の違いを具体的に勉強していきます。

コードを見比べてみよう

まずはリストと配列のコードを見比べて、何が違うのかを見ていきます。

配列もリストも値を取り出す際は、インデックス番号を指定して取り出す方法、forでのループ処理を使って取り出す方法、forとwithIndexを使ってインデックス番号と値の両方を取り出す方法の3つを実践していきます。

配列のサンプルコード

このサンプルコードでは、配列を使って3人兄弟のお小遣いをまとめて出力しています。

// 配列「money」に3人分のお小遣いを格納
val money = intArrayOf(5000,10000,15000)

// インデックス番号を指定して値を参照
println("1人目のお小遣いは${money[0]}円です。")
println("2人目のお小遣いは${money[1]}円です。")
println("3人目のお小遣いは${money[2]}円です。")

// forを使ったループ処理で値を参照
for(print in money) {
  println("お小遣いは${print}です。")
}

// forとwithIndexを使ってインデックス番号と値の両方を参照
for((index, money2) in money.withIndex()) {
  println("${index+1}人目のお小遣いは${money2}です。")
}

配列のコードの出力

配列のサンプルコードを実行すると、以下のように出力されます。

// インデックス番号を指定して値を参照
1人目のお小遣いは5000円です。
2人目のお小遣いは10000円です。
3人目のお小遣いは15000円です。

// forを使ったループ処理で値を参照
お小遣いは5000です。
お小遣いは10000です。
お小遣いは15000です。

// forとwithIndexを使ってインデックス番号と値の両方を参照
1人目のお小遣いは5000です。
2人目のお小遣いは10000です。
3人目のお小遣いは15000です。

リストのサンプルコード

では続いて、リストを使って3人兄弟のお小遣いをまとめて出力します。

// リスト「money」に3人分のお小遣いを格納
val money = listOf(5000,10000,15000)

// インデックス番号を指定して値を参照
println("1人目のお小遣いは${money[0]}円です。")
println("2人目のお小遣いは${money[1]}円です。")
println("3人目のお小遣いは${money[2]}円です。")

// forを使ったループ処理で値を参照
for(print in money) {
  println("お小遣いは${print}です。")
}

// forとwithIndexを使ってインデックス番号と値の両方を参照
for((index, money2) in money.withIndex()) {
  println("${index+1}人目のお小遣いは${money2}です。")
}

リストのコードの出力

リストのサンプルコードを実行すると、以下のように出力されます。

// インデックス番号を指定して値を参照
1人目のお小遣いは5000円です。
2人目のお小遣いは10000円です。
3人目のお小遣いは15000円です。

// forを使ったループ処理で値を参照
お小遣いは5000です。
お小遣いは10000です。
お小遣いは15000です。

// forとwithIndexを使ってインデックス番号と値の両方を参照
1人目のお小遣いは5000です。
2人目のお小遣いは10000です。
3人目のお小遣いは15000です。

このように配列とリストの2つを見比べてみると、それぞれ1行目の配列「money」に値を代入する部分と、リスト「money」に値を代入する部分以外は同じになっています。

配列では「intArrayOf」と記述したのに対し、リストでは「listOf」となっていて定義方法のみ違い、値の参照方法は配列もリストも同じです。

リンコ
リンコ

配列とリストのそれぞれに値を代入した後、値の参照方法はどちらも全く一緒ピヨ!

値の書き換えが可能かどうか

定義方法こそ違いましたが、値の参照方法は配列もリストも同じでした。しかし決定的な違いがあり、それは「値の書き換えが可能かどうか」です。

配列の値はデータの中身が書き換えできますが、リストは文法上のルールとして書き換えが不可能になっていて、リストで値を書き換えようとするとコンパイルエラーになります。

// 配列の例
val sample1 = intArrayOf(1,2,3)
sample1[2] = 4 //書き換えが可能で、値の3が4になる

// リストの例
val sample2 = listOf(1,2,3)
sample2[2] = 4 //コンパイルエラー発生
リンコ
リンコ

リストでは値の書き換えができないので注意ピヨ!

クラスなのかインターフェースなのか

配列とリストにはもう1つ「クラスなのかインターフェースなのか」という違いがあります。

配列(Array)は「クラス」で、リスト(List)は「インターフェース」という違いがありますが、Kotlinの入門的な部分を勉強している現段階ではあまり気にしなくてもいいかもしれません。

ただこの違いは頭の片隅には置いておきましょう。

【Kotlin】MutableList(ミュータブルリスト)とは?

MutableList(ミュータブルリスト)とは?

続いて、Listに似た名前の「MutableList」とは、どういった時に使う処理なのでしょうか?

リストと同じでインターフェース

まずMutableListは、Listと同じインターフェースになります。ここは特に気にしなくても大丈夫です。

値の増減ができる

こちらが重要なんですが、MutableListは値の数を増やしたり減らしたり(削除)することができます。

この値の増減はListではできないので、値を増減する可能性がある場合の処理は、MutableListを使うようにします。

リンコ
リンコ

ミュータブルリストでは値の増減ができるピヨ!

【Kotlin】MutableListの使い方

MutableListの使い方

では実際にMutableListの使い方を勉強していきましょう。MutableListの使い方では、値の増減方法を1つ1つ解説していきます。

MutableListで値を増減させる書式

MutableListを使う場合の書式は以下のようになります。

値を代入する場合

まず値を代入する場合は、Listと同じような形の書式になります。

// 通常のミュータブルリストの書式
val ミュータブルリスト名: MutableList<型名> = mutableListOf(値1,値2,値3...)
// 省略したMutableListの書式
val ミュータブルリスト名 = mutableListOf(値1,値2,値3...)

基本的にリストと同じで、Listと記述された部分がMutableListとなっているだけですね。

値を増やす場合

次に値を増やす場合の書式は以下のようになります。

ミュータブルリスト名.add("値")

ミュータブルリスト名の後に「.add(値)」で「()」内に値を記述するだけでオッケーです。

値をインデックス番号で削除する場合

続いて値を削除する方法ですが、削除する方法には2種類あり、まず1種類目がインデックス番号で削除する方法です。

ミュータブルリスト名.removeAt(インデックス番号)

ミュータブルリスト名の後に「.removeAt(インデックス番号)」で「()」内にインデックス番号を記述することで削除できます。

インデックス番号がわかっている場合には、こちらを使うようにするとスムーズです。

値を指定して削除する場合

もう1種類は、値を指定して削除する方法です。

ミュータブルリスト名.remove(値)

ミュータブルリスト名の後に「.remove(値)」で「()」内に値を記述することで削除できます。

インデックス番号がわからず、値がわかる場合はこちらを使うようにするとスムーズです。

MutableListで値を増減させたコードを記述してみよう

では実際にMutableListを使ったコードを記述してみましょう。

サンプルコード

以下のサンプルコードでは、ミュータブルリストに挨拶の言葉をいくつか追加したり、2種類の削除方法で削除しています。

コードと出力を見比べて、どのように動いているか勉強していきましょう。

// 3種類の挨拶をミュータブルリスト「greetings」に代入
val greetings = mutableListOf("おはよう", "こんにちは", "こんばんは")
// 「おやすみ」と「すみません」を追加
greetings.add("おやすみ")
greetings.add("すみません")
// 一度「greetings」の中身を出力
for((index,value) in greetings.withIndex())
println("${index} : ${value}")

// インデックス番号を指定して「おはよう」を削除
greetings.removeAt(0)
// 値を指定して「こんばんは」を削除
greetings.remove("こんばんは")

println("--------2回目の出力-----------")

// 再度「greetings」の中身を出力
for((index,value) in greetings.withIndex())
println("${index} : ${value}")

出力

サンプルコードを実行すると、以下のように出力されます。

0 : おはよう
1 : こんにちは
2 : こんばんは
3 : おやすみ
4 : すみません
--------2回目の出力-----------
0 : こんにちは
1 : おやすみ
2 : すみません

最初に「add」で追加した「おやすみ」と「すみません」が追加され、5つの挨拶が出力されました。

その後2種類の削除方法で「おはよう」と「こんばんは」を削除し、3つの挨拶が出力されました。

MutableListで値を増やす場合、任意の位置に増やすこともできる

ミュータブルリストを使って値を増減させる方法を勉強しましたが、値を増やす際に最後尾に増やすのではなく、任意の位置に増やすこともできます。

サンプルコード

以下のサンプルコードでは、任意の位置に値を増やしています。

// 3種類の挨拶をミュータブルリスト「greetings」に代入
val greetings = mutableListOf("おはよう", "こんにちは", "こんばんは")
// 2つ目に「おやすみ」を追加
greetings.add(1, "おやすみ")

// 「greetings」の中身を出力
for((index,value) in greetings.withIndex())
println("${index} : ${value}")

出力

サンプルコードを実行すると、以下のように出力されます。

0 : おはよう
1 : おやすみ
2 : こんにちは
3 : こんばんは

このように「add」で値を記述する際に、インデックス番号で追加したい場所を指定することで、任意の位置に値を追加することができます。

リンコ
リンコ

値を増減する方法は意外と使うのでしっかり覚えるピヨ!

まとめ

この記事では、プログラミング言語であるKotlinのListとMutableListについて勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • リストは配列と同じで変数をまとめて管理するために使う
  • リストと配列は値の参照の仕方は全く一緒
  • 配列では値の書き換えができるが、リストではできない
  • ミュータブルリストでは値の増減ができる
  • 値の増やし方は1種類、減らし方は2種類ある

また配列、リスト、ミュータブルリストの仕様をいかのようにまとめたので参考にしてください。

定義するための関数 値の書き換え 値の増減 実装方法
Array 型名arrayOf() × クラス
List listOf() × × インターフェース
MutableList mutableListOf() インターフェース

この3つに共通するのは、データをひとまとめに保管しておくことができるということです。またデータを「順序付き」で保管しておけることから「順序付きコレクション」と呼ばれています。

今回勉強した「List」や「MutableList」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「SetとMutableSet」について勉強していくピヨ!

プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!

コメント

タイトルとURLをコピーしました