【Kotlin練習問題】コレクション:all, any, noneの使い方

predicateの種類

以下の記事で説明したように、Kotlinではコレクションから特定の条件でデータを抽出する際の条件はpredicateというラムダ式によって定義されます。

predicateと組み合わせて使われる関数にはいくつかタイプがあり、filter()のように条件に合致する要素を返すフィルタリング用の関数の他に今回紹介する、要素がpredicateに合致しているかどうかをtrueかfalseで返すtest predicateとよばれるものがあります。

test predicateにはall()any()none()の三つがあります。それぞれの使い方を以下で説明していきます。

all()の使い方

all()は渡されたpredicateに全ての要素が合致していればtrueを返します。

空のコレクションでall()が呼び出された場合はtrueが返されます。

以下のコードをご覧ください。

val numbers = listOf("one", "two", "three", "four")

println(numbers.all { it.endsWith("e") }) //false

このコード中のpredicateはit.endWith(“e”)の部分ですが、関数名からも推測できるように要素が”e”で終わっているかを確認するためのものです。

numbersの中で”e”で終わっている要素は”one”と”three”だけなので、結果はfalseが返されます。

any()の使い方

 any()もall()と使い方は同じです。

any()の場合は渡されたpredicateに一つでも要素が合致していればtureが返されます。

先ほどと同じコードでall()との違いを確認してみましょう。

val numbers = listOf("one", "two", "three", "four")

println(numbers.any { it.endsWith("e") }) //true
println(numbers.all { it.endsWith("e") }) //false

any()の場合は一つでも合致していればtrueが返されるので、”one”と”three”があてはまり、trueが返されています。

none()の使い方

none()もall()、any()と使い方は全く同じです。

none()は渡されたpredicateに要素が一つも合致していなければtrueが返されます。

val numbers = listOf("one", "two", "three", "four")

println(numbers.none { it.endsWith("a") }) //true

今回は”a”で終わる要素を探すようにpredicateを指定していますが、”a”で終わる要素は一つもないのでtrueが返されます。

またany()とnone()に関してはpredicateがなくても使うことができます。

その場合、コレクションが空かどうかをチェックしてくれます。
any()はそのコレクションに一つでも要素があればtrue、空であればfalseを返します。

none()はany()と逆の挙動をします。

問題

all、anyを活用して以下の関数を実装してください。

  • checkAllCustomersAreFrom ― 全てのcustomerが引数に与えられたcity出身であればtrueを返す
  • hasCustomerFrom ― 与えられたcity出身のcustomerが一人でもいればtrueを返す

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

問題コード:

// 全てのcustomerが引数に与えられたcity出身であればtrueを返す
fun Shop.checkAllCustomersAreFrom(city: City): Boolean =
        TODO()

// 与えられたcity出身のcustomerが一人でもいればtrueを返す
fun Shop.hasCustomerFrom(city: City): Boolean =
        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=”非表示”]

答え

// 全てのcustomerが引数に与えられたcity出身であればtrueを返す
fun Shop.checkAllCustomersAreFrom(city: City): Boolean =
        customers.all { it.city == city }

// 与えられたcity出身のcustomerが一人でもいればtrueを返す
fun Shop.hasCustomerFrom(city: City): Boolean =
        customers.any { it.city == city }

[解説]

customerについて調べたいので、allとanyが使われるのはShopクラスの中にあるcustomersに対してです。

predicateではit.cityでそれぞれの要素(customer)のcityと引数に与えれたcityが等しいかを調べています。

allもanyも渡されるpredicateはまるっきり同じです。

[/expander_maker]

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

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

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

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

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

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

おすすめ書籍

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

[itemlink post_id=”1743″]

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

[itemlink post_id=”1745″]