🐙

夏休みなのでKotlinのmapについて詳しくなる

に公開

mapとは?

map {} は リストなどのコレクションを「変換」するための関数

■書式
変換元.map { 変換の方法 }

例えば、1~5までの数字が入ったnumbersというリストがあります。
val numbers = listOf(1, 2, 3, 4, 5)

このリストの中身に10を足して11~15のリストを作りたいとします。
val newNumbers = numbers.map { it + 10 }
{}の中のitはnumbersリストの各要素のことです。
newNumbersには[11,12,13,14,15]が入ります。

問題1

1~5までの数字が入ったリストがあります。
このリストの各要素を2倍にして、result変数を使って、新しいリストを作ってください。

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

    // ここに map を使って2倍に変換するコードを書いてください
    val result = // ??

    println(result) // 期待される出力: [2, 4, 6, 8, 10]
}
答え

val result = numbers.map { it * 2 }

問題2

1~5までの数字が入ったnumberというリストがある。
result変数を使って、リストの内容を文字列に変換してください。という問題に対して、
val result = numbers.toString()と記述した。
これは、要件に合致していないのですが、何が間違っているのか?

答え

val result = numbers.toString()と記述してしまうと、
numbersリストごとまるっと文字列になってしまう。
👉"[1,2,3,4,5]"こんな感じ。

正しくは、こう。

val result = numbers.map { it.toString() }

これであれば、"1","2","3","4","5"という文字列のリストがresultに入る。
👉[1,2,3,4,5]

問題3

1~5までの数字が入ったnumbersというリストがある。
result変数を使って、偶数なら2倍に変換、奇数ならそのままにしてください。

答え

{}の中にif文を使って条件指定しながら変換。
if (it % 2 == 0) 👉偶数ならtrue
偶数👉 it * 2 (要素を2倍)
奇数👉 it (そのまま)

val result = numbers.map{ if (it % 2 == 0) it * 2 else it }

👉[1,4,3,8,5]

問題4

1~5までの数字が入ったnumbersというリストがある。
result変数を使って、偶数だけを残し、2倍に変換してください。
※filter{}関数を使えば、偶数だけにできるよ!

答え

まず、filter{}を使って、必要な要素だけに絞り、
次に残った要素をmap{}を使って2倍にする。

val result = numbers
    .filter { it % 2 == 0 } // 偶数だけ残す
    .map { it * 2 }         // 2倍に変換

👉[4,8]

問題5

要素とインデックスの両方を扱えるmapIntexedを使った問題。
1~5までの数字が入ったnumbersというリストがある。
result変数を使って、「index番号×要素」に変換したリストにしてください。
mapの場合は、numbers.map{...}だったが、
mapIndexedは、numbers.mapIndexed {index,i -> ...}となります。

答え
val result = numbers.mapIndexed { index,i ->
    index * i
}

👉[0,2,6,12,20]

問題6

変換しつつnull文字を除外するmapNotNullを使った問題。
1~5までの数字が入ったnumbersというリストがある。
result変数を使って、偶数は2倍に、奇数はnullにして除外したリストにしてください。

答え

if条件式を使って、偶数なら2倍、奇数ならnullにすれば、
mapNotNullによってnullは削除されるので、偶数しか残らないリストになるよ

val result = numbers.mapNotNull { if(it % 2 == 0) it * 2 else null }

👉[4,8]

問題7

1~5までの数字が入ったnumbersというリストがある。
以下の通り処理し、新しいresultリストを作成してください。
1.奇数だけ残す
2.残った数字をインデックス番号×数字に変換
3.結果が0出ない場合のみ残す

答え

丁寧に処理をするとこんな感じ。

val result = number
    .filter { if(it % 2 != 0) }
    .mapIndexed { index,i -> index * i }
    .mapNotNull { if(it==0) it else null }

mapIndexedNotNullを使ってこんな感じにもできます。

val result = numbers.mapIndexedNotNull { index, i ->
    if (i % 2 != 0) {
        val product = index * i
        if (product != 0) product else null
    } else {
        null
    }
}

mapのプロになった気がします!!!!

Discussion