夏休みなのでfilterについて詳しくなる
filterとは?
filter {} は リストなどのコレクションから「一定の条件で要素を抽出」するための関数
■書式
変換元.filter { 抽出条件 }
例えば、1~10までの数字が入ったnumbersというリストがあります。
val numbers = listOf(1,2,3,4,5,6,7,8,9,10)
このリストから奇数だけを抜き出して新しいリストresultを作る場合、以下の通り記述します。
val result = numbers.filter { it % 2 != 0 }
{}の中のitはnumbersリストの各要素のことです。
各要素÷2の余りが0でなければ奇数ということになります。
resultには[1, 3, 5, 7, 9]が入ります。
fun main() {
val numbers = listOf(1,2,3,4,5,6,7,8,9,10)
val result = numbers.filter { it % 2 != 0 }
println(result)
}
👉[1, 3, 5, 7, 9]
問題1
1~10までのnumbersというリストがあります。
変数resultを使って、numbersから偶数だけを抜き出したリストを作成してください。
答え
偶数は2で割り切れる数字です。
と、いうことはfilterの条件は、リストの各要素÷2=0となります。
val result = numbers.filter { it % 2 == 0 }
👉[2, 4, 6, 8, 10]
問題2
1~10までのnumbersというリストがあります。
変数resultを使って、numbersから5以上の数字を抜き出したリストを作ってください。
答え
filterの条件に5以上を設定すればOkです。
val result = numbers.filter { it >= 5 }
👉[5, 6, 7, 8, 9, 10]
問題3
以下の文字列があります。
val words = listOf("apple", "banana", "avocado", "cherry", "apricot")
この中から"a"で始まる単語だけを抜き出してください。
答え
最初の一文字を取得する関数startsWith("")を使います。
val result = words.filter { it.startsWith("a") }
👉[apple, avocado, apricot]
問題4
以下の文字列があります。
val words = listOf("apple", "banana", "avocado", "cherry", "apricot")
この中から、文字数が5文字以下の単語だけを抜き出してください。
答え
文字数を取得するlengthを使います。
val result = words.filter { it.length <=5 }
👉[apple]
問題5
Personというデータクラスを使って、とある人たちのリストpeopleを作成しました。
peopleの中から20歳以上の人たちを抜き出してください。
data class Person(val name: String, val age: Int)
fun main() {
val people = listOf(
Person("Anna",42),
Person("Alice",17),
Person("Bob",20),
Person("Kenta", 15),
Person("Yoshi",31)
)
val result = /* 答えを入れてね! */
println(result)
}
答え
20歳以上の人を抜き出すには、PersonのageにアクセスすればOK!
itは各要素を表しているのでPerson("Anna",42)などを指しています。
itがPerson("Anna",42)のとき、it.ageは42です。
ということは。。。
val result = people.filter { it.age >= 20}
👉[Person(name=Anna, age=42), Person(name=Bob, age=20), Person(name=Yoshi, age=31)]
問題6
問題5のpeopelリストの中から、名前が「A」で始まる人だけを抜き出してください。
答え
最初の1文字目がAであることは、startsWith("A")と表せました。
itがPerson("Anna",42)のとき、it.nameはAnnaです。
ということは。。。
val result = people.filter { it.name.startsWith("A") }
👉[Person(name=Anna, age=42), Person(name=Alice, age=17)]
最後に
filterNotという関数があり、filterとは逆のフィルタリングをします。
■書式
filterNot { 抽出しない条件 }
例えば、以下はfilterを使って、1~10までの数列のうち、
奇数だけを抽出しています。
fun main() {
val numbers = listOf(1,2,3,4,5,6,7,8,9,10)
val result = numbers.filter { it % 2 != 0 }
println(result)
}
👉[1, 3, 5, 7, 9]
これをfilterNotで表現すると、「偶数」を抽出しないという条件になるので
いかようになります。
val result = numbers.filterNot { it %2 ==0 }
ふ~~~~~~。暑すぎて集中力が30分しか持ちません💦
エアコンの部屋に避難します!!!!!!
Discussion