【Kotlin練習問題】コレクション:フィルタリング

コレクションのフィルタリング

あるコレクションの中から特定の条件を満たす(または満たさない)要素だけを抽出する処理のことをフィルタリングと言います。

フィルタリングはコレクションの処理において最もメジャーな処理とも言えます。

Kotlinではフィルタリングする際の条件はpredicate(プレディケイト:述部の意)によって定義されます。predicateはコレクションの要素を取り、boolean値を返すラムダ関数のことです。

predicateに合致していればtrueそうでなければfalseが返されるようになっています。

標準ライブラリには一回の呼び出しでコレクションをフィルタリングできる拡張関数がいくつか用意されています。

これらの関数はもとのコレクションには変更を加えないので、そのコレクションが読み込み専用かそうでないかは問わずに利用することができます。

フィルタリングした結果を処理するには結果を変数に代入するか、フィルタリングの後でチェーンにして別の関数で処理します。

predicateでフィルタリングする

基本的なフィルタリング用の関数はfilter()です。predicateを使ってfilter()を呼び出すと、それに合致する要素を返します。

またListに対してもSetに対しても返される結果のコレクションはListです。Mapに対してはMapが返されます。

val numbers = listOf("one", "two", "three", "four")  
val longerThan3 = numbers.filter { it.length > 3 } //要素が3より大きい
println(longerThan3) //[three, four]

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10} //キーが"1"
で終わっており値が10よりも大きい
println(filteredMap) //{key11=11}

上記コードの numbers.filter { it.length > 3 }におけるit.length > 3や、numbersMap.filter { (key, value) -> key.endsWith(“1”) && value > 10}における(key, value) -> key.endsWith(“1”) && value > 10predicateに該当します。


it.length のitはnumbersに含まれるそれぞれの要素を意味します。

基本的なフィルタリング方法は以上になります。それでは確認問題を解いてみましょう。

問題

filter()を用いて指定されたcityに住む顧客(customer)のリストを返すメソッドを実装してください。

なお、Shopクラスと全ての関連するクラスはShop.ktに含まれています。

問題コード:

// 指定したcityに住む顧客を取得する
fun Shop.getCustomersFrom(city: City): List<Customer> =
        TODO()

Shop.kt

data class Shop(val name: String, val customers: List<Customer>)
​
data class Customer(val name: String, val city: City, val orders: List<Order>) {
    override fun toString() = "$name from ${city.name}"
}
​
data class Order(val products: List<Product>, val isDelivered: Boolean)
​
data class Product(val name: String, val price: Double) {
    override fun toString() = "'$name' for $price"
}
​
data class City(val name: String) {
    override fun toString() = name
}
[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

fun Shop.getCustomersFrom(city: City): List<Customer> =
        customers.filter { it.city == city }

[解説]

getCustomersFrom関数に渡されたcityとcustomersに含まれる要素のcityが合致するかを調べるpredicateを指定しています。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]