夏休みなので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